《设计模型:可复用面向对象的基础》
记录《设计模型:可复用面向对象的基础》的概念笔记
面向对象需要有底层思维和抽象思维
解决软件复杂的两种方法,分解和抽象
软件设计的金科玉律是:复用!
面向对象设计的八大原则
- 依赖倒置原则(DIP)
- 开放封闭原则(OCP),修改封闭,扩展开放
- 单一职责原则(SRP)
- Liskov替换原则(LSP)
- 接口隔离原则(ISP)
- 优先使用对象组合,而不是类继承
- 封装变化点
- 针对接口编程,而不是针对实现编程—-接口标准化
设计原则升级为设计经验包括设计习语,设计模式,架构模式
重构的关键技法:
- 静态->动态
- 早绑定->晚绑定
- 继承->组合
- 编译时依赖->运行时依赖
- 紧耦合->松耦合
Template Method(模板方法,组件协作模式)定义一个操作中的算法骨架(稳定),而将一些步骤延迟到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可以重定义(override重写)该算法的某些特定步骤。就是把相对稳定的骨架部分放到底层。
Strategy(策略模式,组件协作模式)定义了一系列算法,把它们一个个封装起来,并且使它们可以互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展、子类化)
一般说来,如果程序中存在if-else语句就说明可以使用策略模式重构,但不是绝对的,如果判断条件稳定不变的时候(如一周7天),也是可以使用if-else
Observer(Event)(观察者模式,组件协作模式)定义对象间的一种一对多(变化)的依赖关系,以便一个对象(Subject)的状态发生改变时,所有依赖它的对象都得到通知并自动更新
**Decorator(装饰模式,单一职责模式)**,动态地给一个对象增加一些额外的职责。就增加功能而言。Decorator模式比生成子类(继承)更加灵活(消除重复代码&减少子类个数)
**Bridge(桥模式,单一职责模式)**将抽象部分(业务功能)与实现部分(平台实现)分离,使它们可以独立的变化。
Factory Method(工厂方法,对象创建模式)定义一个用于创建对象的接口,让子类决定实例化哪个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类
Abstract factory(抽象工厂,对象创建模式)提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定他们具体的类。
Prototype(原型模式,对象创建模式)使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象
Builder(构件器模式,对象创建模式)–不常用。将一个复杂对象的构建和其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示。
Singleton(单件模式,对象性能模式)保证一个类只有一个实例,并提供一个该实例的全局访问点。
Flyweight(享元模式,对象性能模式)运用共享技术有效的支持大量细粒度的对象
接口隔离模式:在组件的构建过程中,某些接口之间的直接依赖常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口。
Facade(门面模式,接口隔离模式)为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得子系统更加容易使用(复用)
Proxy(代理模式,接口隔离模式)为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问。
Adapter(适配器,接口隔离模式)将一个类的接口转换为客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Mediator(中介者模式,接口隔离模式)–不常用。用一个中介对象来封装(封装变化)一系列对象交互。中介者使各对象不需要显式的相互引用(编译时依赖->运行时依赖),从而使其耦合松散(管理变化),而且可以独立的改变它们之间的交互。
**State(状态模式,状态变化模式)**允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎改变了其行为。
memento(备忘录模式,状态变化模式)–有点过时。在不破坏封装性的前提下,捕获一个对象的内部转态,并在该对象之外保存这个转态。这样就可以将该对象恢复到原先保存的状态。
Composite(组合模式,数据结构模式)将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
Iterator(迭代器,数据结构模式)–已经过时。提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露(稳定)该对象的内部结构。
Chan of Resposibility(职责链,数据结构模式)–有点过时。使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它。
Command(命令模式,行为变化模式)–不常用。将一个请求(行为)封装为一个对象,从而可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
Visitor(访问器模式,行为变化模式)–要慎用。表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作。
interpreter(解析器,邻域规则模式)–不常用。给定一个语言,定义它的文法中的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。
模式的核心目标,管理变化,提高复用!
什么时候不用模式:
- 代码可读性很差时
- 需求理解还很浅时
- 变化没有显现时
- 不是系统的关键点
- 项目没有复用价值
- 项目将要发布时
经验之谈:
- 不要为了模式而模式
- 关注抽象类&接口
- 理清变化点和稳定点
- 审视依赖关系
- 要有Framework和Application的区隔思维
- 良好的设计是演化的结果