设计模式系列-面向对象葵花宝典-面向对象技巧
声明:本系列为面向对象葵花宝典一书学习总结内容,原作者博客链接
第三部分:面向对象技巧
8. 设计原则
8.1. 内聚和耦合
内聚
是否专注模块的职责,是内聚性的充要条件
是否与模块处理的内容相关耦合
耦合(或者称依赖)是程序模块相互之间的依赖程度
内聚关注模块内部的元素结合程度,耦合关注模块之间的依赖程度消息耦合 模块间的耦合关系表现在发送和接收消息
数据耦合 两个模块间通过参数(简单类型或者复杂类型)传递基本数据,称为数据耦合。
控制耦合 当一个模块通过某种方式( 传参)来控制另外一个模块的行为时,称为控制耦合
全局耦合 当两个模块共享相同的全局数据,称为全局耦合8.2. 类设计原则
SRP(single responsibility principle)单一职责原则
用于类的设计
类的职责是站在其它类的角度来定义的
类的职责包含多个相关功能 一个类有多个方法,这些
方法是相关的
SRP不能应用于聚合类(多个职责类的组合)OCP(Open-Closed Principle)开闭原则
总的指导思想
提供者(生产者)增加新的功能,但使用者(消费者)不需要修改代码
例如 A 类调用了B类的方法,则 A就是消费者,B就是生产者
所谓的增加新功能,并不是增加一个全新的功能,而是原有的功能有了替代实现LSP(Liskov substitution principle)里氏替换原则
用于指导类继承的设计
针对父类的单元测试用例,传入子类是否也能够测试通过
同一个方法,子类可以有不同的实现,从而实现多态ISP(Interface Segregation Principle)接口隔离原则
用于指导接口的设计
客户端不应该被强迫去依赖它们并不需要的接口
建议客户端不需要知道整个类,只需要知道具有内聚接口的抽象父类即可
实现接口的类,可以替换 方法中的接口参数DIP(dependency inversion principle)依赖倒转原则
用于指导如何抽象
高层模块不应该直接依赖低层模块,两者都应该依赖抽象层(稳定的部分)
抽象不能依赖细节(变化的部分),细节必须依赖抽象(稳定的部分)
从不同的范围角度看,模块的范围不同 架构层-子系统 子系统-组件
高层模块基于抽象层编程 低层模块继承或者实现抽象层不要过度设计
9. 设计模式
9.1. 设计模式简介
模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心”,即:模式是重复发生的问题的解决方案。9.2. 设计模式只是一把锤子
两个主要约束
1)设计模式解决的是“可复用”的设计问题;
2)设计模式应用的领域是“面向对象”;9.3. 设计模式之道
设计模式的“道”就是用来指导我们什么时候用设计模式,为什么要用设计模式,
23 个设计模式只是告诉了我们 how,而设计模式之道却可以告诉我们 why 和 where!
八字精解:找到变化(where),封装变化(why)
“封装变化”意味着将变化的影响范围控制最小,将风险降到最低(不是拒绝变化)9.4. 原则 VS 模式
设计原则主要用于指导“类的定义”的设计
设计模式主要用于指导“类的行为”的设计9.5. 模式详解
学习设计模式
学习设计模式的时候,我们必须深入理解某个设计模式是为了解决什么变化引起的问题,
然后再看这个设计模式是如何应用“两个基本点”对应的原则来封装这个变化的。应用设计模式
在实际应用的时候,我们不要一开始就想着要把某个模式塞到某个地方,
而是先找到可能变化的地方,再来看具体使用哪个模式可以封装这种变化。模式讲解-案例
装饰模式
更多模式请查看原书讲解。