设计模式的种类
在众所周知的设计书《Domain-Driven Terms》中,它被描述为:
“设计模式是命名、抽象和识别对可重用的面向对象设计有用的的通用设计结构。设计模式确定类和他们的实体、他们的角色和协作、还有他们的责任分配。
每一个设计模式都聚焦于一个面向对象的设计难题或问题。它描述了在其它设计的约束下它能否使用,使用它后的后果和得失。因为我们必须最终实现我们的设计模式,所以每个设计模式都提供了例子..代码来对实现进行阐释。
虽然设计模式被描述为面向对象的设计,它们基于那些已经被主流面向对象语言实现过的解决方案...”
设计模式可以被分成几个不同的种类。在这个部分我们将复习三个分类,并且在我们进入特定的设计模式详情之前我们提到该分组下的模式的几个示例。
创建型设计模式
创建型设计模式关注于对象创建的机制方法,通过该方法,对象以适应工作环境的方式被创建。基本的对象创建方法可能会给项目增加额外的复杂性,而这些模式的目的就是为了通过控制创建过程解决这个问题。
属于这一类的一些模式是:构造器模式(Constructor),工厂模式(Factory),抽象工厂模式 (Abstract),原型模式 (Prototype),单例模式 (Singleton)以及 建造者模式(Builder)。
结构设计模式
结构模式关注于对象组成和通常识别的方式实现不同对象之间的关系。该模式有助于在系统的某一部分发生改变的时候,整个系统结构不需要改变。该模式同样有助于对系统中某部分没有达到某一目的的部分进行重组。
在该分类下的模式有:装饰模式,外观模式,享元模式,适配器模式和代理模式。
行为设计模式
行为模式关注改善或精简在系统中不同对象间通信。
行为模式包括:迭代模式,中介者模式,观察者模式和访问者模式。
设计模式的分类
在我早起学习设计模式的经验中,我个人发现,下面的表格是一个非常有用的提醒,大多数模式所提供-它覆盖了由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() );
设计模式分类概览表
现在让我们看看这个表格。
| SN | 描述 |
|---|---|
| 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(访问者) | 为类增加新的操作而不改变类本身。 |
本章结束语:
每天坚持加深基础概念的理解,会让你在这条路上走的更远!