面向对象设计模式是指那些满足“应对变化,提高复用”的模式。现代软件设计的特征是“需求的频繁变化”。设计模式的要点是“寻找变化点,然后在变化点处应用设计模式,从而来更好的应对需求的变化”。设计模式不应该滥用、先入为主,需要在变化的地方有需要复用的地方应用设计模式。没有一步到位的设计模式,应该有一版实现基本功能的代码,重构时这些模块违背了什么设计模式,违背了哪些设计原则,然后使用迭代方式重构到设计模式。

一、从封装变化角度对模式分类

1.1组件协作:

       通过晚期绑定来实现框架与应用之间的松耦合。

1.2单一职责

       责任划分不清,子类会急剧膨胀,充斥重复代码,这时关键是责任划分,即类与类责任划分问题。

1.3“对象”创建型模式

       绕开new,避免对象创建(new)过程中的紧耦合(依赖具体类),支持对象创建的问题,是接口抽象之后的第一步工作。简单工厂和工厂方法很多归结为一类设计模式,统称为工厂方法。

1.4对象性能

        面向对象解决抽象问题,但付出一定性能代价,某些情况下需谨慎处理,采用性能模式。

1.5接口隔离

        接口直接依赖会带来问题,添加一层间接(稳定)接口来隔离互相紧密关联接口实现接口隔离。

1.6状态变化

        解决对象状态经常面临变化,有效管理这些状态,同时又维持高层模块稳定的一种方案。

1.7数据结构

        组建内部具有特定数据结构,将这些特定数据结构封装在内部,在外部提供统一接口,实现与特定数据结构无关的访问的一种方案。

1.8行为变化

        组件行为变化导致组建本身剧烈变化,这时需要将组件的行为和组件本身进行解耦,支持组件行为变化,实现两者的松耦合。

1.9领域问题

        特定领域,某些变化虽频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下一般性解决方案。

二、八大原则

2.1依赖倒置原则 DIP

        高层模块不依赖于低层模块,而是都依赖于抽象;

        抽象不依赖于实现细节,实现细节应该依赖于抽象。

2.2开放封闭原则 OCP

        对扩展开放,对依赖关闭;

        类的模块是可扩展的,但是不可修改。

2.3单一职责原则 SRP 

        一个类仅有一个能引起他的变化;

        变化的方向隐含着类的责任。

2.4里氏替换(Liskov)替换原则 LSP

        派生类能够替换他的基类;

        继承表达了类的抽象。

2.5接口隔离原则 ISP

        不应该强迫客户程序依赖他们不用的方法;

        接口应该小而强大。

2.6对象组合优于类继承

        类的继承破坏了封装性,子类父类耦合度高,类继承通常称为“白箱复用和“,对象组合称为”黑箱复用”;

        对象组合只需要有良好的定义的接口,耦合度低。

2.7封装变化点

        使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧修改,而不会对另一侧产生不良影响。

2.8面向接口编程

        减少系统中个部分的依赖关系,从而实现”高内聚,松耦合“的类型设计方案;

        不将变量类型声明为某个特定的具体类,而是声明为某个接口。

三、重构关键技法

        都一样,从不同角度看同一个问题。

  • 静态——>动态
  • 早绑定——>晚绑定
  • 继承——>组合
  • 编译时依赖——>运行时依赖
  • 紧耦合——>松耦合

四、一个目标

        管理变化,提高复用!

参考内容:

视频去哪了呢?_哔哩哔哩_bilibili(参考:哔哩哔哩C++设计模式!!!)

Erich Gamma,Richard Helm.《设计模式 可复用面向对象软件的基础》[M].机械工业出版社,2019:

更多推荐