《设计模式》笔记
看了《敏捷软件开发(原则模式与实践)》,感受Java的设计原则和模式真的很棒,看了这本书收获很多。关于设计原则/模式的笔记记录如下。
一 设计的臭味
1 僵化性
难以对软件进行改动。如果单一的改动会导致有依赖关系的模块中的连锁改动,那么设计就是僵化的。
2 脆弱性
进行一个改动时,程序的许多地方就可能出现问题。
3 牢固性
设计中包含有对其他系统有用的部分,但把这些部分从系统中分离出来所需要的努力和风险是巨大的。
4 粘滞性
软件的粘滞性 与环境的粘滞性(耦合关系很重的一些指标, 绝对路径,绝对依赖等)。
5 不必要的复杂性
涉及中包含当前没有用的部分,它就含有不必要的复杂性(过度设想和设计未来可能使用的接口)。
6 不必要的重复
当同样的代码,以稍微不同的形式一再出现时,就表示开发人员忽视了抽象。
7 晦涩性
模块难以理解
二 设计原则
设计原则主要是用来避免以上问题的一些策略或技巧。
1 SRP(Single ResPonsibility Principle):单一设计原则
就一个类而言,应该有且仅有一个引起他变化的原因。
职责:变化的原因。 如果能想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责。
2 OCP(The Open-Closed Principle):开放封闭原则
软件实体(类/模块/函数等)应该是可以扩展的,但是应该是不可修改的。对扩展开放而对修改封闭。关键就是用好抽象和多态。
获取封闭性的方法
a. 使用抽象获取显式封闭(封闭是建立在抽象基础上的,过程化的解决方案违反OCP) b. 使用数据驱动的方法获取封闭性
3 LSP(Liskov Substitution Principle)Liskov 替换原则
子类型subtype必须能够替换掉它们的基类型base type。如果新派生类的创建会导致改变基类,这就常常意味着设计是有缺陷的。
继承是IS-A(“是一个”)关系,即如果一个新类型的对象被认为和一个已有类型的对象之间满足IS-A关系,那么这个新对象的类应该从这个已有对象的类派生。OOD(面向对象开发)中IS-A是就行为方式而言的,行为方式是可以进行合理假设的。
DBC(Designed By Contract)基于契约设计 。 契约是通过为每个方法声明的前置条件和后置条件来指定的, 要使一个方法得以执行,前置条件必须为真,执行完毕后该方法要保证后置条件为真。
子类方法的前置条件<= 基类方法的前置条件
子类方法的后置条件>=基类方法后置条件
如果一组类都支持一个公共的职责,那么他们应该从一个公共职责的超类来继承该职责。违反LSP原则的表现:
- 派生类中函数退化
- 派生类中添加了基类不会抛出的异常
4 DIP(Dependence Inversion Principle)依赖倒置原则
- 高层模块不应该依赖于底层模块,二者应该依赖于抽象。
- 抽象不应依赖于细节,细节应该依赖于抽象。
高层调用一个声明的接口(抽象),底层模块实现接口。
找出潜在的抽象,高层应用策略:应用背后的抽象,是那些不随具体细节改变而改变的真理。
如何实现倒置?
- 倒置接口 所有权:低层模块实现高层模块中声明并被高层模块调用的接口
- 依赖抽象:程序中所有依赖关系都应该终止于抽象类或接口
5 ISP(Interface Segregation Principle)接口隔离原则
不应该强迫客户依赖于他们不用的方法,这个原则用来处理“胖”接口所具有的缺点。“胖”接口可以分解成多组方法,每一类方法都服务于不同的客户程序,根据客户所调用的方法对客户进行分组,而不是为每个客户创建分离的接口。
分离接口的方法
- 使用委托分离接口;
- 使用多重继承分离接口;