从C++谈设计模式:设计模式概述

概述

设计模式(Design pattern)是面向对象软件设计的经验总结,每一个设计模式系统的命名、解释和评价了面向对象系统中的一个重要的和重复出现的设计。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代 码可靠性。 项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。

内容

  • 工厂模式(Factory Pattern):定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

  • 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

  • 单例模式(Singleton Pattern):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

  • 建造者模式(Builder Pattern):将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

  • 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

  • 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

  • 桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使它们都可以独立的变化。

  • 过滤器模式(Filter、Criteria Pattern):这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来

  • 组合模式(Composite Pattern):将对象组合成树形结构以表示”部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

  • 装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

  • 外观模式(Facade Pattern):为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

  • 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。

  • 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。

  • 责任链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

  • 命令模式(Command Pattern):将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

  • 解释器模式(Interpreter Pattern):给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。

  • 迭代器模式(Iterator Pattern):提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。

  • 中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

  • 备忘录模式(Memento Pattern):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

  • 观察者模式(Observer):被观察者(主题)被N个观察者观察着,被观察者有变化,则会导致所有观察者也变化。主要应用于生命周期控制。

  • 状态模式(State Pattern):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

  • 策略模式(Strategy Pattern):定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

  • 模板模式(Template Pattern):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

  • 访问者模式(Visitor Pattern):主要将数据结构与数据操作分离。

分类

设计模式在粒度和抽象层次上各不相同。通常采用两条准则对模式进行分类。第一是目的准则,即模式是用来完成什么工作的。模式依据其目的可分为创建型、结构型和行为型三种。创建型模式与对象的创建有关;结构型模式处理类或对象的组合;行为型模式对类或对象怎样交互和怎样分配职责进行描述。第二是范围准则,指定模式主要是用于类还是用于对象。类模式处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时刻便确定下来了。对象模式处理对象间的关系,这些关系在运行时刻是可以变化的,更具动态性。

下表详细描述设计模式的分类:

关系

设计模式之间的关系是用来描述各个设计模式之间怎样互相引用来组织设计模式的,具体的模式关系如下图所示:

六大原则

开闭原则(Open Close Principle)

开闭原则:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码。一句话概括就是:为了使程序的扩展性好,易于维护和升级。

单一职责原则(Single Responsibility Principe)

单一指责原则:一个类或者一个接口,最好只负责一项职责。每个类应该实现单一的职责,如若不然,就应该把类拆分。

里氏代换原则(Liskov Substitution Principle)

里氏代换原则(Liskov Substitution Principle LSP):任何基类可以出现的地方,子类一定可以出现,它是面向对象设计的基本原则之一。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

依赖倒转原则(Dependence Inversion Principle)

依赖倒转原则:真对接口编程,依赖于抽象而不依赖于具体。

接口隔离原则(Interface Segregation Principle)

接口隔离原则:使用多个隔离的接口,比使用单个接口要好。该原则用于降低类之间的耦合度。

迪米特法则(最少知道原则)(Demeter Principle)

迪米特法则:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

原则总结

开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭,用抽象构建框架,用实现扩展细节;单一职责原则告诉我们一个类或者接口只负责一项职责;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合;

重点

  • 单件(Singleton)模式
  • 抽象工厂(Abstract Factory)模式和工厂(Factory Method)模式
  • 适配器(Adapter)模式
  • 迭代器(Iterator)模式
  • 观察者(Observer)模式
  • 装饰者(Decorator)模式
  • 策略(Strategy)模式

参考

  1. 14种常用设计模式
  2. 《设计模式-可复用面向对象软件的基础》

版权声明

  1. 本文由 Howie Lee 发表,采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。请确保你已了解许可协议,并在 转载 时声明。
  2. 转载请注明来源,本文固定链接:http://www.lifower.com/?p=200

——文章采用PyPoster离线发布,欢迎到GitHub支持原作者!