1.定义:高层次的模块不应该依赖低层次的模块,二者应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
2.问题:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来完成。此时,假如类A是高层次的模块,如果修改则会引起不必要的风险。
3.解决:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接的与类B或者类C发生联系,此时会降低修改A的几率。
4.理解:在编程的过程中,需要尽量的提炼出抽象的模型,抽象的东西是稳定的,在Java中体现为接口以及抽象类,我们需要实现的功能则是通过实现接口或者抽象类的方法来实现。
依赖倒置的核心就是面向接口编程。
5.实例:
(1)定义接口:
interface IReader{
public String getContent();
}
(2)实现功能:
class Newspaper implements IReader {
public String getContent(){
return "我会读报纸";
}
}
class Book implements IReader{
public String getContent(){
return "我会读书";
}
}
class Mother{
public void narrate(IReader reader){
System.out.println("妈妈开始讲故事");
System.out.println(reader.getContent());
}
}
public class Client{
public static void main(String[] args){
Mother mother = new Mother();
mother.narrate(new Book());
mother.narrate(new Newspaper());
}
}
这样修改无论是让妈妈实现什么功能,则无需修改Mother类。
6.注意:
(1).低层模块尽量都要有抽象类或接口,或者两者都有。
(2).变量的声明类型尽量是抽象类或接口。
(3).使用继承时遵循里氏替换原则。
注:个人学习随记!