前言
命名、抽象、标识是通用设计结构的主要方面,这些设计结构能被用于构造可复用的面向对象设计。设计模式确定所包含的类和实例、它们的角色、协作方式以及职责分配。
每一种设计模式都重点关注一个特定的对象设计问题或者设计要点,描述何时使用它,在另一些约束条件下是否还能使用,以及使用的效果和利弊。由于我们最终要实现设计,设计模式还是提供了示例,代码来阐明其实现。
虽然设计模式描述的是面向对象设计,但是他们都是基于实际的解决方案。这些设计方案的实现语言是主流面向对象的编程语言。
设计模式的分类
创建型设计模式
创建型设计模式专注于处理对象创建机制,以适合给定情况下的方式来创建对象,创建对象的基本方法都可能导致项目复杂性增加。而这些模式旨在通过控制创建过程来解决这类问题。
常见的创建型设计模式包括:Constructor构造器模式、Factory工厂模式、Abstract抽象模式、Prototype原型模式、Singleton单例模式和Builder生成器模式。
结构型设计模式
结构型设计模式与对象组合有关,通常可以用于找出在不同对象之间建立关系的简单方法。这种模式有助于确保在系统某一部分发生变化时,系统的整个结构不需要同时改变。同时对于不适合因某一特定目的而改变的系统部分,这种模式也可以帮助它们完成重组。
常见的结构型设计模式有:Decorator装饰者模式、Facade外观模式、Flyweight享元模式、Adapter适配器模式和Proxy代理模式。
行为型设计模式
行为型设计模式专注于改善或简化系统中不同对象之间的通信。
行为模式包括:Iterator迭代器模式、Mediator中介者模式、Observer观察者模式、Visitor访问者模式。
Class
Javascript是一种无类语言,但可以用函数来模拟类,然后使用new关键字创建新的对象,使用this来定义对象的新属性和方法。
1 | function Car(model){ |
然后我们像这样我们使用上面定义的car构造函数来实例化该对象。
1 | var myCar=new Car("ford"); |
创建型模式 | 基于创建对象的概念 |
类 | |
工厂方法 | 基于接口数据或者生成几个派生类的一个实例 |
对象 | |
抽象工厂 | 创建若干类系列的一个实例,无需描述具体的的类 |
生成器 | 从表示中分离对象构建;总是创建相同类型的对象 |
原型 | 用于复制或者克隆完全初始化的实例 |
单例 | 一个类在全局访问点只有唯一一个实例 |
结构型模式 | 基于构建对象块的想法 |
类 | |
适配器 | 匹配不同类的接口,因此可以在不兼容接口的情况下共同工作 |
对象 | |
适配器 | 匹配不同类的接口,因此可以在不兼容接口的情况下共同工作 |
桥接 | 将对象接口从器实现中分离,因此它们可以独立进行变化 |
组合 | 简单和复合对象的结构,使对象的总和不只是它们各部分的总和 |
装饰 | 向对象动态添加备选的处理 |
外观 | 隐藏整个子系统复杂性的唯一一个类 |
享元 | 一个用于实现包含在别处信息的高效共享的细粒度实例 |
代理 | 占位符对象代表真正的对象 |
行为型模式 | 基于对象在一起配合工作的方式 |
类 | |
解释器 | 将语言元素包含在应用程序中的方法,以匹配预期语言的语法 |
模板方法 | 在方法中创建算法的shell,然后将确切的步骤推到子类 |
对象 | |
职责链 | 在对象链之间传递请求的方法,以找到能够处理请求的对象 |
命令 | 将命令执行从其调用程序中分离的方法 |
迭代器 | 顺序访问一个集合中的元素,无需了解该集合内部的工作原理 |
中介者 | 在类之间定义简化的通信,以防止一组类显式引用彼此 |
备忘录 | 捕获对象的内部状态,已能够在以后恢复它 |
观察者 | 向多个类通知改变的方式,以确保类之间的一致性 |
状态 | 状态改变时,更改对象的行为 |
策略 | 在一个类中封装算法,将选择与实现分离 |
访问者 | 向类添加一个新的操作,无需改变类 |