设计模式(Design Pattern)
一、设计模式-由来
克里斯托弗·亚历山大 《建筑模式语言》
1994年 埃里希·伽玛、约翰·弗利赛德斯、拉尔夫·约翰、理查德·赫尔姆(四人组 Gang of four, Gof) 《设计模式:可复用面向对象软件元素》 23种
二、设计模式-目的
- 可重用性(相同功能的代码,不用多次编写)
- 可读性(编程规范,便于其他程序员的阅读和理解)
- 可扩展性(当需要增加新功能时,非常方便,即:可维护)
- 可靠性(增加新功能后,对原来的功能没有影响)
- 使程序呈现高内聚、低耦合的特性
三、设计模式-六大原则
基础原则:单一职责原则
类、方法、接口
对于一个类,只有一个引起该类变化的原因:该类的职责是唯一的,且这个职责是唯一引起其他类变化的原因
1.开闭原则(Open Close Principle)
对扩展开放,对修改关闭
- 对于扩展是开放的:模块的行为是可以扩展的。当需求改变时,可以对模块进行扩展,使其具有满足改变的新行为。
- 对于修改是关闭的:对模块的行为进行扩展时,不必改动模块的源代码或二进制代码。
示例: 更换飞书主题
2.里氏替换原则(Liskov Substitution Principle)
基类与子类之间的关系
任何基类可以出现的地方,子类一定可以出现。
里氏替换原则是对开闭原则的补充
, 基类与子类的继承关系是抽象化的具体实现,实现开闭原则的关键步骤是抽象化
,里氏替换原则是实现对象抽象化的具体步骤
的规范。
示例: 正方形不是长方形
3.依赖倒置(倒转)原则(Dependence Inversion Principle)
依赖对象接口,而不是具体对象
针对接口编程,依赖于抽象而不依赖具体的实现。(降低了客户与实现模块间的耦合)
依赖倒置原则是开闭原则的基础
。
示例: 组装电脑
4.接口隔离原则(Interface Segregation Principle)
接口按照功能细分
客户端不应该依赖他不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上。
实现方式:使用多个专门的接口比使用单一接口要好,可以降低类之间的耦合度。
5.迪米特法则(最少知道原则,Demeter Principle,LOD)
类与类之间的亲疏关系
一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象尽可能少的了解,只进行通信,不和陌生人说话。
6.合成复用原则(组合/聚合复用原则,Composite Reuse Principle)
类与类的关联关系
尽量使用对象组合/聚合关系
(关联关系),而不是继承来达到复用的目的。
四、设计模式-分类
1.创建型模式(Creation Patterns 5种)
提供创建对象的机制,增加已有代码的灵活性和可复用性
- 抽象工厂模式(AbstractFactory):创建相关或依赖对象的家族,而无需明确指定具体类。
- 工厂方法模式(FactoryMethod):定义一个创建对象的工厂接口,让子类决定实例化哪个类。
- 单例模式(Singleton):某个类只能有一个实例,提供一个全局的访问点。
- 建造者模式(Builder,创建者、生成器):封装一个复杂对象的创建过程,并可以按步骤构造。
- 原型模式(Prototype):通过复制现有的实例来创建新的实例。
2.结构型模式(Structural Patterns 7种)
介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效
- 适配器模式(Adapter Patterns):将一个类的方法接口转换成客户希望的另一个接口。
- 桥接模式(Bridge Patterns):将抽象部分和它的实现部分分离,使他们都可以独立的变化。
- 组合模式(Composite Patterns):将对象组合成树形结构以表示
部分-整体
的层次结构。 - 装饰器模式(Decorator Patterns):动态的给对象添加新的功能。
- 外观模式(Facade Patterns):对外提供一个统一的方法,来访问子系统中的一群接口。
- 享元模式(Flyweight Patterns):通过共享技术有效的支持大量细粒度对象。
- 代理模式(Proxy Patterns):为其他对象提供一个代理以便控制这个对象的访问。
3.行为型模式(Behavioral Patterns 11种)
负责对象间的高效沟通和职责委派
- 责任链模式(Chain of Responsibility Patterns):将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求的机会。
- 命令模式(Command Patterns):将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。
- 解释器模式(Interpreter Patterns):给定一个语言,定义它的文法的一种表示,并定义一个解释器。
- 迭代器模式(Iterator Patterns):一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构。
- 中介者模式(Mediator Patterns):用一个中介对象来封装一系列的对象交互。
- 备忘录模式(Memento Patterns):在不破环封装的前提下,保持对象的内部状态。
- 状态模式(State Patterns):允许一个对象在其对象内部状态改变时,改变它的行为。
- 策略模式(Strategy Patterns):定义一系列算法,把他们封装起来,并且使他们可以相互替换。
- 模板方法模式(Template Patterns):定义一个算法结构,而将一些步骤延迟到子类实现。
- 观察者模式(Observer Patterns):对象间的一对多的依赖关系。
- 访问者模式(Visitor Patterns):不改变数据结构的前提下,增加作用于一组对象元素的新功能。