1.高层模块不该该依赖低层模块,两者都应该依赖抽象架构
2.抽象不该该依赖于细节。细节应该依赖于抽象this
1.简单介绍spa
结构良好的面向对象架构都具备清晰的层次定义,每一个层次经过一个定义良好的、受控的接口向外提供了一组内聚的服务。设计
对于这个陈述的简单理解可能会导致设计者设计出相似下图的结构。3d
图中,高层的Policy层使用了低层的Mechanism层,而Mechanism层又使用了更细节的Utility层。这样,Policy层对下面的Utility层的改动都是敏感的。 这种依赖关系是传递的。这是很是糟糕的。code
下图则展现了一个更为合适的模型。 每一个较高层次都为它所须要的服务声明一个抽象接口。较低的层次实现了这些抽象接口。每一个高层类都经过该抽象接口使用下一层,这样高层就不依赖于低层。低层反而依赖于在高层中声明的抽象服务接口。这解除了Policy层、Mechanism层和Utility层的两两依赖关系。对象
2.倒置的接口全部权blog
这里的倒置不单单是依赖关系的倒置,它也是接口全部权的倒置。接口
可是当应用DIP时,咱们发现每每是客户拥有抽象接口,而它们的服务者则从这些抽象接口派生。it
这就是著名的Hollywood(好莱坞)原则:"Don't call us,we'll call you.(不要找咱们,咱们会去找你)"。
低层模块实现了在高层模块中声明并被高层模块调用的接口。
Hollywood原则解释:
//不该用IOC class A { B b = new B(); } //应用IOC class A { B b = null; // 你不须要本身找B,当你须要的时候,B会自动替你初始化。 public A(B b) { this.b=b; } }
经过这种致使的接口全部权,对于Mechanism层或者Utility层的任务改动都不会再影响到Policy层。并且,Policy层能够定义符合policyServiceInstance的任何上下文重用。经过倒置这些依赖关系,咱们建立了一个更灵活、更持久、更易改变的结构。
3.依赖于抽象
依赖于抽象建议咱们不该该依赖于具体类--也就是说,程序中全部的依赖关系都应该终止于抽象类或者接口。
事实上,这种依赖关系的致使正是好的面向对象设计的标志所在。使用何种语言来编写程序是可有可无的。若是程序的依赖关系是倒置的,他就是面向对象的设计。若是程序的依赖关系不是倒置的,他就是过程化设计。