Hello, Boswell!

我早期学习设计模式的经验中,我自己发现下面的表格,它提醒许多模式必须提供什么。它包含了Gof提到的23种设计模式。原始的表格是Elyse Nielsen在2004年下半年总结的,我已经在必要的地方修改过它,来适合我们在本书这一部分的讨论。

我推荐实用这个表格作为参考,但是记着,还有许多额外的模式在这里没有提到,但是会在这本书的后面会讨论。

关于类的简短笔记

注意:es2015引入了原生的类支持到js中,但是,首先,它们是js现存基于原型的继承模型的语法糖。我们不会在书中涉及es2015类,但是mdn又它们极好的介绍。

记住,表格中又得模式参考了类的概念。在es5中,js是无类语言,但是类能实用函数模拟。

想要做到这个的最统一的方法是定义js函数,之后,我们在其中使用new关键字来创建对象。this能够被用来帮助定义对象的属性以及方法,如下:

// 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() );

使用js定义类的更多方式,看Stoyan Stefanov的关于它们的有用博客。

现在,让我们继续查看表格:

创建型 基于创建对象的概念

  • 类

工厂方法 这使得基于接口数据或事件的多个派生类成为一个实例

  • 对象

抽象工厂 创建几个相似的类的实例,而不需要详细关注类

建造者 单独的对象从它的代表中构造,一直创建相同类型的对象

原型 用来拷贝或者克隆的完整的初始化实例

单例 只有单个又全局访问点的实例的类

构造型 基于构建对象块的思想

  • 类

适配器 匹配不同类的接口,因此,尽管接口不兼容,类还是能够在一起工作

  • 对象

桥接 把对象的接口和它的实现分离,这样两者可以独立变化

组合 简单组合对象的结构,使得整个对象不只是各个部分总和

装饰器 动态的给对象添加可选处理

门面 隐藏了整个子系统的复杂度的单个类

享元 一种细粒度的实例,用于有效共享包含在其他地方的信息

代理 一个代表真实对象的占位符对象

行为型 基于对象一起玩耍和工作的方式

  • 类

解释器 在应用中,包含语言元素用来匹配目标语言的语法的一种方式

模板方法 在方法中创建算法的外壳,延迟额外的步骤到子类中

  • 对象

职责链 对象链之间床底请求来找到处理请求的对象的方法

命令 封装一个命令请求作为一个启用的对象,日志和/或请求队列,以及给未处理请求提供错误处理

迭代器 连续的访问集合对象,而不用了解集合的内部工作原理

中介者 在类之间定义简单的通信来阻止一组类相互显示引用

备忘录 捕获一个对象的内部状态,以便之后能够恢复它

观察者 通知许多类改变来确保类之间的统一的方式

状态 状态改变时,它修改对象的行为

策略 将算法封装在类中,将选择与实现分离

访问者 给类添加一个新的操作符,而不会改变类

Last Updated:
Contributors: jmz, Boswell, Boswell, mingzhuang.ji