1. 起源
模式 是由模式之父 (Christopher Alexander,克里斯托弗·亚历山大)及其研究团队对住宅和周边环境进行大量调查研究和资料收集之后,分析得出人们对舒适住宅和环境存在一些共同的认同规律,并将这些规律归纳为253个模式。
模式之父在他的经典著作《建筑的永恒之道》中对模式给出了定义:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的核心解决方案,通过这种方式,我们可以无数次地重用已有的成功解决方案,无须再重复相同的工作。
2. 诞生
软件模式的诞生是由“四人组(Gang of Four, GoF)”将模式的概念引入软件工程领域开始。软件模式(Software Patterns)是在软件开发中某些可重现问题的一些有效解决方法,其并非仅限于设计模式,还包括架构模式、分析模式和过程模式等。实际上,在软件开发生命周期的每一个阶段都存在着一些被认同的模式。
软件模式主要由四部分构成:问题描述(需要解决的问题是什么)、前提条件(何种情况下使用)、解决方案(如何解决)、最终效果(有哪些优缺点)。
3. 设计模式
设计模式(Design Pattern)是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结,其是软件模式中研究最深入的一个分支,也是软件工程的基石。设计模式用于在特定的条件下为一些重复出现的软件设计问题提供合理的、有效的解决方案。
GoF在1994年归纳发表了23中在软件开发使用频率较高的设计模式, 其所著的《Design Patterns:Elements of Resuable Object-Oriented Software》标志着设计模式正式成为面向对象软件工程的一个重要研究分支。
设计模式一般包含模式名称、问题、目的、解决方案、效果等组成要素。模式名称(Pattern Name)通过一组词来描述模式的问题、解决方案和效果,以便使用者能够更准确的理解,通常使用功能或模式结构命名;问题(Problem) 描述何种情况下使用该模式;解决方案(Solution)描述设计模式的组成成分,以及它们之间的关系,通常使用UML类图和核心代码来描述;效果(Consequence) 描述模式的优缺点以及在使用时如何权衡的问题。
GoF 设计模式只有23个,根据其用途将它们分为:创建型模式(Creational Pattern)主要用于描述如何创建对象;结构型模式(Structural Pattern)主要用于描述如何实现类或对象的组合;行为型(Behavioral)主要用于描述类或对象怎样交互以及怎样分配职责。
(1)创建型模式(Creational Pattern)
- 单例模式(Singleton Pattern)
- 工厂方法模式(Factory Method Pattern)
- 抽象工厂模式(Abstract Factory Pattern)
- 原型模式(Prototype Pattern)
- 建造者模式(Builder Pattern)
(2)结构型模式(Structural Pattern)
- 适配器模式(Adapter Pattern)
- 桥接模式(Bridge Pattern)
- 组合模式(Composite Pattern)
- 装饰模式(Decorator Pattern)
- 外观模式(Facade Pattern)
- 享元模式(Flyweight Pattern)
- 代理模式(Proxy Pattern)
(3)行为型模式(Behavioral Pattern)
- 职责链模式(Chain of Responsibility Pattern)
- 命令模式(Command Pattern)
- 解释器模式(Interpreter Pattern)
- 迭代器模式(Iterator Pattern)
- 中介者模式(Mediator Pattern)
- 备忘录模式(Memento Pattern)
- 观察者模式(Observer Pattern)
- 状态模式(State Pattern)
- 策略模式(Strategy Pattern)
- 模板方法模式(Template Method Pattern)
- 访问者模式(Visitor Pattern)
面向对象设计原则
(1)开闭原则(Open Close Principle,OCP)
对外扩展开放,对修改关闭。
(2)里氏代换原则(Liskov Substitution Principle,LSP)
面向对象设计的基本原则之一。任何基类出现的地方,子类一定可以出现。该原则中,子类对父类的方法尽量不要重写或重载。
(3)依赖倒转原则(Dependence Inversion Principle,DIP)
针对接口编程,依赖于接口或抽象类不依赖于实现类。
(4)接口隔离原则(Interface Segregation Principle,ISP)
使用多个接口,比使用单个接口要好,降低类之间的耦合度。
(5)迪米特法则(最少知道原则,Law of Demeter,LoD)
实体之间尽量少的交互。
(6)合成复用原则(Composite Reuse Principle,CRP)
减少使用继承,多使用合成/聚合的方式。
(7)单一职责原则(Single Responsibility Principle,SRP)
参考文档:
从招式与内功谈起——设计模式概述(一)
从招式与内功谈起——设计模式概述(二)
GOF 面向对象 23 种设计模式详解
设计模式简介