前言:本文系学习《大话设计模式》过程的知识总结
总结:单一职责原则、开放——封闭原则、依赖——倒转原则、里氏代换原则、迪米特法则
一、基本思想(也即开放——封闭原则的简单体现)
避免重复: 例如实现一个计算器,要做的是将计算和显示分开。 这样计算的代码可以在多处复用。
计算器中如何体现继承,多态呢?
考虑扩展性, 如果要在加减乘除的基础上添加开根号等运算, 如果不通过抽象, 那么需要知道这个计算类的全部细节才能完成编译 。
抽象的第一级别 : 定义一个抽象运算类和多个具体的运算类,再通过简单工厂实现调用。(这里用到了多态的父类指针指向子类对象)
抽象类定义元素和获取结果的抽象方法
运算类继承抽象类,实现具体的运算方法。
简单工厂: switch 通过传入的方法 new 具体运算类对象, 返回抽象类指针。
二、设计原则
1.单一职责原则SRP:就一个类而言,应该仅有一个引起它变化的原因。
一个类承担的职责过多, 职责耦合在一起,会导致脆弱的设计,一个职责的变化可能会限制类完成其它职责的能力。
如果你能想到多于一个的动机去改变一个类,这个类就具有多于一个的职责,就应该考虑职责的分离。
2.开放——封装原则 OCP:对于扩展是开放的,对于修改是封装的。
(面对需求改变,对程序的改动是通过增加新代码实现的,而不是更改现有的代码)[上面的基本思想即是这个原则的实例应用]
绝对的封闭是不存在的,所以:
首先,要在设计初期猜测出最有可能发生的变化种类,构造抽象来隔离这些变化;
其次,变化发生时立即采取行动 ——> 创建抽象来隔离以后发生的同类变化;
注意:仅对呈现出频繁变化的那些部分做抽象,拒绝不成熟的抽象。
3.依赖——倒转原则
A.高层模块不应该依赖低层模块,两个都应该依赖抽象。
B.抽象不应该依赖细节,细节应该依赖抽象。
(针对接口编程,不要对实现编程。 联系操作系统的 设备管理层——设备框架层——设备驱动层)
高层模块 ——(关联)—— 接口 <——(继承)—— 低层模块
4.里氏代换原则 LSP: 子类型必须能够替换掉它们的父类型。
(一个软件实体如果是使用一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。 这就像多态的父类指针指向子类对象,所以接口是没有变化的 [ 但具体接口的实现是有差异的 ]。 )
5.迪米特法则(最少知识原则):如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,应该通过第三方转发这个调用。[ 例如,多数情况下公司里可以由人事、主管等负责协调两个部门之间的公事]
在类的设计原则上,每一个类都应当尽量降低成员的访问权限。 迪米特原则强调了类之间的松耦合,耦合越弱,越利于复用。