一、定义
1.依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
二、依赖倒转设计和规范
1.上层模块不应该依赖底层模块,它们都应该依赖于抽象。
2.抽象不应该依赖于细节,细节应该依赖于抽象。
三、案例
1.我第一次去海边钓鱼,所有我要带鱼竿,但是第二次去不仅想钓鱼还想抓螃蟹,又要带一个渔网,第三次去还要抓八爪章鱼,这时就要带叉子了,不然你会缠住哦!
发现随着下海技术的提升,想要更多的海产品,就要更多的工具,依赖就越来越多了。
这时可以抽象一个工具出来,因为你要抓的海产品都可以解释为工具,就算你后面要坐船去抓鲸鱼,也只要加一个方法就好了,可以一直在后面加。
/** * @author 作者 ki16: * @version 创建时间:2021年7月21日 下午5:48:05 * */ public class RelyOn { public static void main(String[] args) { Person p = new Person(); p.implement(new FishingRod()); p.implement(new Fork()); } } class Person{ public void implement(Tool t){ t.useTool(); } } interface Tool{ default void useTool(){}; } class FishingRod implements Tool{ public void useTool(){ System.out.println("使用鱼竿:开始钓鲨鱼了!"); } } class Fork implements Tool{ public void useTool(){ System.out.println("使用叉子:开始叉八爪章鱼了!"); } }
四、依赖关系传递的三种方式:核心就是传递
①、接口传递
/** * @author 作者 ki16: * @version 创建时间:2021年7月21日 下午5:48:05 * */ public class RelyOn1 { public static void main(String[] args) { FishingRod fish = new FishingRod(); Person person = new Person(); person.implement(fish);//人使用鱼竿工具去钓鱼 person.implement(new Fork()); } } interface Tool{ public void implement(useTool use); } class Person implements Tool{ @Override public void implement(useTool use) { use.use(); } } interface useTool{ public void use(); } class FishingRod implements useTool{ @Override public void use() { System.out.println("使用鱼竿!"); } } class Fork implements useTool{ @Override public void use() { System.out.println("使用叉子!"); } }
②、构造方法传递
/** * @author 作者 ki16: * @version 创建时间:2021年7月21日 下午5:48:05 * */ public class RelyOn2 { public static void main(String[] args) { Tool tool = new Person(new FishingRod());//人拿着鱼竿 tool.implement();//人拿着鱼竿去钓鱼 } } interface Tool{ public void implement(); } class Person implements Tool{ private UseTool useTool; public Person(UseTool useTool) { this.useTool = useTool; } @Override public void implement() { this.useTool.use(); } } //使用工具 interface UseTool{ public void use(); } class FishingRod implements UseTool{ @Override public void use() { System.out.println("使用鱼竿!"); } }
③、setter 方法传递
import javax.jws.soap.SOAPBinding.Use; /** * @author 作者 ki16: * @version 创建时间:2021年7月21日 下午5:48:05 * */ public class RelyOn2 { public static void main(String[] args) { FishingRod fishingRod = new FishingRod(); Tool tool = new Person(); tool.setUseToll(fishingRod); tool.useTool(); } } interface UseTool{ public void use(); } class FishingRod implements UseTool{ @Override public void use() { System.out.println("使用鱼竿钓鱼!"); } } interface Tool{ public void useTool(); public void setUseToll(UseTool useTool); } class Person implements Tool{ private UseTool useTool; @Override public void useTool() { this.useTool.use(); } @Override public void setUseToll(UseTool useTool) { this.useTool = useTool; } }