设计模式 — 概述 — 1/n

Kai Chen
5 min readFeb 20, 2018

--

检验学习的最好的方式,就是把它讲/写出来。

这是一个学习设计模式的系列文章,主要记录我对于设计模式的学习、思考和总结。

设计模式 (Design Pattern) 是什么?

是什么?

1. 套路。这是对以往软件设计中各种模式的汇总,提炼出共性。告诉我们各种模板,套用的场景,列举优缺点。
2. 最佳实践。它节约了很多时间。有时候,我们绞尽脑汁,想出来的解决方案在设计模式中早已提到,并且更完善。
3. 思维方法。它给我们的更多是一种设计思维。许多现实的问题并不能直接用现成的设计模式,但这并不是说设计模式就没用了。所谓“运用之妙,存乎一心”。对于设计模式,学的是如何能够高屋建瓴地看问题,如何融合现有的模式并加以取舍,如何融会贯通去运用。
4. 行话。让我和其他的程序员聊设计的时候,有共同的语言,节省成本。

不是什么?

设计模式不是万灵药。不是所有的问题都需要用设计模式去解决。就好比手里有个锤子,看到啥都是钉子。有时候,简单的解决方法反而更美。

为啥要用设计模式?

设计模式主要是伴随面向对象编程 ( Object oriented programming) 的出现而兴起。在面向过程和函数式编程中,并没有设计模式。所以,设计模式用到了许多特性例如:`继承` ,`多态` ,`接口` 这些面向对象才有的特性。

当然,很多东西是相通的。其他的编程方式也是互相借鉴和进步。所以,学习设计模式要多想,多练,多从更通用的角度思考。

何时使用设计模式?

任何时候。

在项目的最开始想想是不是能用设计模式。

在结束复盘的时候想想先前用的设计模式是不是很好地适应了需求, 有哪些优点,又可以有哪些改进。这些都是在不久的将来能够`运用之妙,存乎一心`的积累。

有哪些设计模式?

设计模式大致可为3大类,总共23个具体的模式。

创建 — Creational

  • 抽象工厂 — Abstract factory :提供一个创建一系列相关或相互依赖对象的**接口**,而无需指定他们具体的类。
  • 工厂 — Factory method:定义一个用于创建对象的接口,让子类决定实例化哪一个。
  • 建造者 — Builder :将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 原型 — Prototype :指定创建对象的种类,并且通过复制这个原型创建新对象。
  • 单例 — Singleton :保证只有一个实例,并提供一个访问它的全局访问点。

结构 — Structural

  • 适配器 — Adapter:将一个类的接口转换成客户希望的另外一个接口。把原本接口不兼容的的类可以一起工作。
  • 桥接 — Bridge:将抽象部分与它的实现部分分离,使它们可以独立变化。
  • 组合 — Composite:将对象组合成树形结构以表示`部分 — 整体` 的层次结构。
  • 装饰 — Decorator:动态地给一个对象添加一些额外的职责。
  • 外观 — Facade:为子系统中的一组接口提供一个一致界面。
  • 享元 — Flyweight:利用共享技术有效地支持大量细粒度对象。
  • 代理 — Proxy:为其他对象提供一个代理以控制对这个对象的访问。

行为 — Behavioral

  • 责任链 — Chain of responsibility:为解除请求的发送者和接受者之间耦合,使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
  • 命令 — Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。
  • 迭代器 — Iterator:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
  • 中间人 — Meditator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,使其解耦,而且可以独立地改变它们之间的交互。
  • 备忘录 — Memento:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。以后用于恢复对象。
  • 观察者 — Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖它的对象得到通知并刷新。
  • 状态 — State:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
  • 策略 — Strategy:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
  • 访问者 — Visitor:表示一个作用于某对象结构中的各元素的操作。
  • 模板方法 — Template method:定义一个操作中的算法骨架,将一些步骤的实现交给子类。
  • 解释器 — Interpreter:给定一个语言,定义它的文法的一种表示,并定义一个解释器,解释这种语言。

参考

入门

进阶

视频

--

--

Kai Chen
Kai Chen

Written by Kai Chen

Engineer / Investor / Photographer

No responses yet