设计模式的分类

优质
小牛编辑
138浏览
2023-12-01

在我早起学习设计模式的经验中,我个人发现,下面的表格是一个非常有用的提醒,大多数模式所提供-它覆盖了由GOF提出的23种模式。最早的表格由 Elyse Nielsen 在2004年汇总,我已经做了部分修改以适应我们的讨论。

我推荐使用该表格作为参考,但要记住大量额外的模式在这里么有提及,但在本书的后续的章节中会提到。

关于类的简单说明

要记住这张表中会有模式引用“类”的概念。JavaScript是一种弱类型语言,不过类可以通过函数模拟出来。

最常见的实现这一点的方法,是先定义一个JavaScript函数,然后再使用这个新的关键字创建一个对象。可以通过这种方法像下面这样给类定义新的属性与方法。

// A car "class"
function Car( model ) {
	this.model = model;
	this.color = "silver";
	this.year = "2012";
	this.getInfo = function () {
		return this.model + " " + this.year;
	};
}

接着我们可以使用上面定义的Car构造函数实例化对象,就像这样:

var myCar = new Car("ford");
myCar.year = "2010";
console.log( myCar.getInfo() );

更多使用JavaScript定义“类”的方法,参见Stoyan Stefanov的关于这些的有用帖子。

现在让我们看看这个表格。

Creational根据创建对象的概念分成下面几类。
Class
Factory Method
工厂方法
通过将数据和事件接口化来构建若干个子类。
Object
Abstract Factory
抽象工厂
建立若干族类的一个实例,这个实例不需要具体类的细节信息。(抽象类)
Builder
建造者
将对象的构建方法和其表现形式分离开来,总是构建相同类型的对象。
Prototype
原型
一个完全初始化的实例,用于拷贝或者克隆。
Singleton
单例
一个类只有唯一的一个实例,这个实例在整个程序中有一个全局的访问点。
Structural根据构建对象块的方法分成下面几类。
Class
Adapter
适配器
将不同类的接口进行匹配,调整,这样尽管内部接口不兼容但是不同的类还是可以协同工作的。
Bridge
桥接模式
将对象的接口从其实现中分离出来,这样对象的实现和接口可以独立的变化。
Composite
组合模式
通过将简单可组合的对象组合起来,构成一个完整的对象,这个对象的能力将会超过这些组成部分的能力的总和,即会有新的能力产生。
Decorator
装饰器
动态给对象增加一些可替换的处理流程。
Facada
外观模式
一个类隐藏了内部子系统的复杂度,只暴露出一些简单的接口。
Flyweight
享元模式
一个细粒度对象,用于将包含在其它地方的信息 在不同对象之间高效地共享。
Proxy
代理模式
一个充当占位符的对象用来代表一个真实的对象。
Behavioral基于对象间作用方式来分类。
Class
Interpreter
解释器
将语言元素包含在一个应用中的一种方式,用于匹配目标语言的语法。
Template Method
模板方法
在一个方法中为某个算法建立一层外壳,将算法的具体步骤交付给子类去做。
Object
Chain of Responsibility
响应链
一种将请求在一串对象中传递的方式,寻找可以处理这个请求的对象。
Command
命令
封装命令请求为一个对象,从而使记录日志,队列缓存请求,未处理请求进行错误处理 这些功能称为可能。
Iterator
迭代器
在不需要直到集合内部工作原理的情况下,顺序访问一个集合里面的元素。
Mediator
中介者模式
在类之间定义简化的通信方式,用于避免类之间显式的持有彼此的引用。
Observer
观察者模式
用于将变化通知给多个类的方式,可以保证类之间的一致性。
State
状态
当对象状态改变时,改变对象的行为。
Strategy
策略
将算法封装到类中,将选择和实现分离开来。
Visitor
访问者
为类增加新的操作而不改变类本身。