《设计模式之禅》笔记

xiaoxiao2021-04-19  296

六大设计原则

1. 单一职责原则

对于单一职责原则,我的建议是接口一定要做到单一职责,类的设计尽量做到只有一个 原因引起变化


2. 里氏替换原则(LSP)

里氏替换原则的定义:

只要父类能出现的地方子类就可以出现,而且替换为子类不会产生任何错误和异常,使用者不需要知道是父类还是子类,反过来就不行了,有子类出现的地方,父类未必能适应

继承优点:

代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性,提高代码重用性,提高代码的可扩展性

继承缺点: 3. 继承是侵入性的,只要继承,就必须拥有父类的所有属性和方法 4. 降低了代码的灵活性 5. 增强了耦合性,父类的常量、变量和方法被修改时,需要考虑子类的修改,有时候改动量会很大

里氏替换原则为继承定义了一个规范,包含了四层含义

子类必须完全实现父类的方法子类可以有自己的个性覆盖或实现父类的方法时输入参数可以被放大 import java.util.Collection; import java.util.HashMap; import java.util.Map; public class Father { public Collection dosomething(HashMap map){ System.out.println("父类被执行。。。"); return map.values(); } } class Son extends Father{ public Collection dosomething(Map map){ // 重载 方法名相同,输入参数类型不同 System.out.println("子类被执行。。。"); return map.values(); } } class Client{ public static void invoker() { Son f = new Son(); HashMap map = new HashMap(); f.dosomething(map); } public static void main(String[] arg) { invoker(); } }

输出结果为 父类被执行。。。

父类方法的输入参数是HashMap类型,子 类的输入参数是Map类型,也就是说子类的输入参数类型的范围扩大了,子类代替父类传递 到调用者中,子类的方法永远都不会被执行。这是正确的,如果你想让子类的方法运行,就 必须覆写父类的方法。大家可以这样想,在一个Invoker类中关联了一个父类,调用了一个父 类的方法,子类可以覆写这个方法,也可以重载这个方法,前提是要扩大这个前置条件,就 是输入参数的类型宽于父类的类型覆盖范围。这样说可能比较难理解,我们再反过来想一 下,如果Father类的输入参数类型宽于子类的输入参数类型,会出现什么问题呢?会出现父 类存在的地方,子类就未必可以存在,因为一旦把子类作为参数传入,调用者就很可能进入 子类的方法范畴。

覆写或实现父类的方法时输出结果可以被缩小

3. 依赖倒置原则

4. 接口隔离原则

5. 迪米特法则

6. 开闭原则

Processed: 0.017, SQL: 10