上面的代码就是最简单的依赖倒置的实现,我们依赖的是水果工厂接口和水果接口,水果店是在水果生产基地去进货水果,至于进货什么水果,取决于水果生产基地生产什么水果和水果店想进什么水果。而不是依赖具体的水果工厂实现类和具体的水果实现类。
注意:上述部分简单代码并未呈现,详细代码见博客地址:https://www.cnblogs.com/programmerkaixin/p/10918844.html
三、单一职责原则 我觉得单一职责是迪米特法则的一种体现。
单一职责原则:见名知意,专人做专事,不要多管闲事。对于类、接口、方法只负责一项自己的职责。对于自己的职责程序修改之后,不会影响到其的职责程序。高内聚,低耦合的程序必须遵循单一职责,分工明确,可读性、可维护性高。
最简单的示例:咱们人的手脚代替不了眼睛,眼睛也代替不了手脚。
臃肿这个词是不是能很好的体现出单一职责原则呢?代码写的这么臃肿,还能不能好好玩耍啦。
四、接口隔离原则 我觉得接口隔离原则是单一职责原则的一种体现,也是迪米特法则的一种体现。
面向对象编程,万物皆对象。
接口隔离原则:定义多个细化而明确分工的专门接口,不要去定义一个单一臃肿的接口。对于臃肿的接口,我们不好具体实现,这样肯定会违背单一职责原则。
最简单的示例:对于家用小汽车对象来说,往大的说,他属于交通工具类、他属于车类、它属于汽车类。往小的说,它属于家用小汽车类、私家车类。
五、迪米特法则 迪米特法则又叫最少知道原则,也有单一职责和接口隔离原则的味道。
迪米特法则:低耦合,如何做到极致呢,那就是只依赖自己真正有关系的对象。在我职责之外的对象全部拒之门外。
我觉得这个没啥好说的,做到了单一职责,迪米特法则很好实现吧。
六、里氏替换原则 官方定义:任何基类(父类)可以出现的地方,子类一定可以出现。 里氏替换原则是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系。
本人理解: 里氏替换原则是为了约束继承泛滥,就是说,在面向对象程序设计中,必须具有is-A的关系才能去使用继承,而不能去为了实现某一业务需求,为了方便使用继承而继承。
前置条件:每个方法调用之前,该方法应该校验传入参数的正确性,只有正确才能执行该方法,否则认为调用方违反契约,不予执行。这称为前置条件(Pre-condition)。
后置条件:一旦通过前置条件的校验,方法必须执行,并且必须确保执行结果符合契约,这称之为后置条件(Post-condition)。也就是返回值符合。
里氏替换原则约束条件:当存在继承关系时,子类中方法的前置条件必须与超类中被覆盖的方法的前置条件相同或者更宽松;而子类中方法的后置条件必须与超类中被覆盖的方法的后置条件相同或者更为严格。
不要为了继承而继承,而是真的有继承关系的时候才能去继承。
七、合成复用原则 这里结合依赖倒置原则使用合成复用原则效果更佳。
组合(has-a):类比电脑组装,内存、硬盘、cpu、显卡 ······ 它们之间组成了电脑,但是他们之间没有什么关系。这就是组合关系,生命周期一致。
聚合(contanis-a):类比员工聚合成部门。员工和部门是相互独立的,一两个员工离职不影响部门对象。部门解散也不影响员工对象。
合成复用原则:程序复用尽量使用组合关系、聚合关系。尽量少使用继承关系去实现业务需求。
继承会把所有的实现全部暴露给子类。破坏了类的封装性,父类的改变,会影响子类。高耦合。
组合、聚合可以很好的遵循依赖倒置原则,开闭原则。成员对象的细节实现(组合、聚合对象)对于一个新的对象是隐藏的。
合成复用原则配合依赖倒置原则,很好的遵循开闭原则。达到程序高可用、高可维、高可读。
spring为什么这么牛?spring为什么依赖注入?spring为什么是轻量级的?