设计模式-浅谈依赖倒置原则
简单解释了7种原则,重点说了下依赖倒置原则
UML类图中箭头的意思(直接截图的Visio里面的):
单一职责
一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中
开闭原则
对修改关闭,对扩展开放
里氏替换原则
任何能使用父类对象的地方,都应该能透明的替换为子类对象
依赖倒置:
上层不能依赖于下层,他们都应该依赖于抽象
代码实战
举个例子:人给动物喂食的场景
反例:
猫吃鱼
public class CatAnimal { void eat(){ System.out.println("猫吃鱼"); } }
狗啃骨头
public class DogAnimal { void eat(){ System.out.println("狗啃骨头"); } }
人喂动物
public class Person { //喂动物 void feed(DogAnimal dog){ dog.eat(); } void feed(CatAnimal cat){ cat.eat(); } public static void main(String[] args) { Person person = new Person(); person.feed(new DogAnimal()); person.feed(new CatAnimal()); } }
结果
狗啃骨头
猫吃鱼
看下类图
Person是直接依赖Dog和Cat的,若还要喂食其他动物,还需要在Person类中去重载feed方法
正例:
定义一个动物接口: Animal.java
Animal接口中有一个吃(eat)的方法
public interface Animal { public void eat(); }
Cat实现动物这个接口
public class CatAnimal implements Animal{ @Override public void eat() { System.out.println("猫吃鱼"); } }
Dog实现动物这个接口
public class DogAnimal implements Animal{ @Override public void eat() { System.out.println("狗啃骨头"); } }
Person喂食动物
public class Person { void fead(Animal animal){ animal.eat(); } }
测试
public class Test { public static void main(String[] args) { Person person = new Person(); person.fead(new CatAnimal()); person.fead(new DogAnimal()); } }
结果
猫吃鱼
狗啃骨头
看下类图(省略了Test类)
小总结:
Person类不再直接依赖Dog和Cat了,而是依赖于Animal这个接口,当我们还需要去喂食其他动物时,只需要创建个具体动物类去实现动物接口并重写方法就OK,不用再去重载Person的fead方法了,实现了解耦
接口隔离原则
客户端不应该依赖那些它不需要的接口,当一个接口太大时,需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可
组合复用
优先使用对象组合,而不是继承来达到复用的目的
迪米特法则
迪米特法则也叫做最少知道原则(封装)
一个类,对于其他类,要知道的越深越好
结语