C++设计模式目录和总结

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

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

1.1组件协作:

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

  • 模板方法(template method)https://blog.csdn.net/naibozhuan3744/article/details/104999842
  • 策略模式(strategy)https://blog.csdn.net/naibozhuan3744/article/details/105019346
  • 观察者(observer/event)https://blog.csdn.net/naibozhuan3744/article/details/105037327

1.2单一职责

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

  • 装饰器(decorator)https://blog.csdn.net/naibozhuan3744/article/details/106594924
  • 桥模式(bridge)https://blog.csdn.net/naibozhuan3744/article/details/106594924

1.3“对象”创建型模式

       绕开new,避免对象创建(new)过程中的紧耦合(依赖具体类),支持对象创建的问题,是接口抽象之后的第一步工作。

  • 工厂方法(factory method)
  • 抽象工厂(abstract factory)
  • 原型模式(prototype)
  • 构建器(builder)

1.4对象性能

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

  • 单件模式(singleton)
  • 享元模式(flyweight)

1.5接口隔离

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

  • 门面模式(facade)
  • 代理模式(proxy)
  • 适配器(adapter)
  • 中介者(mediator)

1.6状态变化

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

  • 状态模式(state)
  • 备忘录(memento)

1.7数据结构

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

  • 组合模式(composite)
  • 迭代器模式(iterator)
  • 职责链(chain of resposibility)

1.8行为变化

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

  • 命令模式(command)
  • 访问器(visitor)

1.9领域问题

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

  • 解释器(interpreter)

二、八大原则

2.1依赖倒置原则 DIP

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

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

2.2开放封闭原则 OCP

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

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

2.3单一职责原则 SRP 

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

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

2.4Liskov替换原则 LSP

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

        继承表达了类的抽象。

2.5接口隔离原则 ISP

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

        接口应该小而强大。

2.6对象组合优于类继承

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

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

2.7封装变化点

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

2.8面向接口编程

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

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

三、重构关键技法

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

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

四、一个目标

        管理变化,提高复用!

 

 

参考内容:

https://www.bilibili.com/video/av22292899?from=search&seid=8813426322713310552(参考:哔哩哔哩C++设计模式!!!)

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

你可能感兴趣的:(设计模式)