[译文]设计模式

原文网址:sourcemaking.com

 

在软件工程领域,设计模式是一种可用来解决软件设计中常出现的问题的可重复的解决方案。设计模式不是可以直接将其转化为代码的完备设计,它是用来解决不同场景下不同问题的一种描述或模板。

设计模式的用途

有了经过检验的开发范例,设计模式可以加快开发的进度。高效的软件设计应该要考虑那种隐蔽的直到实现时才暴露的问题。使用设计模式可以有效地避免那种可能导致决堤的蚁穴一样的问题,并且对于熟悉设计模式的程序员和架构师来说大大地提高了代码的可读性。

通常,人们知道怎么通过特定的技术或方法去解决特定的问题。但是这类方法很难应用到更宽泛的问题领域。设计模式提供了更通用的解决方案,形成公式化,并且不跟特定的问题捆绑。

另外,设计模式给开发者们提供了一种更好理解和沟通的专业术语。设计模式可以不断地锤炼,变得越来越稳健。

设计模式的分类(译者添加)

可将设计模式划分为三大类:创建类设计模式(Creational Design Patterns)、结构类设计模式(Structural Design Patterns)和行为类设计模式(Behavioral Design Patterns)。

创建类设计模式

创建类设计模式(Creational Design Patterns),顾名思义,就是用来创建对象实例的。这类模式可以进一步的划分为”类创建”模式和”对象创建”模式。所谓类创建,就是在创建过程中有效地利用继承关系。所谓对象创建,就是有效地利用委托关系完成工作。

具体有:

  • 抽象工厂模式(Abstract Factory)
    给一组相关类创建实例
  • 构造器模式(Builder)
    将对象的构造过程拆解
  • 工厂方法模式(Factory Method)
    创建一个用来创建对象的实例
  • 对象池模式(Object Pool)
    避免获取或释放不再使用的对象而引起的高昂的开销
  • 原型模式(Prototype)
    一个用来拷贝或克隆的完整的对象实例
  • 单例模式(Singleton)
    一个类最多存在一个实例

结构类设计模式

结构类设计模式(Structural Design Patterns)是关于对象之间的组合关系的。类创建模式是利用继承关系去组合接口。对象创建模式是定义类对象件的关系以获得新的功能。

  • 适配器模式(Adapter)
    将不同的类转化为契合的接口
  • 桥接模式(Bridge)
    将对象的接口与实现分离
  • 组合模式(Composite)
    将一些简单的对象组成树形结构
  • 装饰者模式(Decorator)
    动态地给对象增加新的功能
  • 门面模式(Facade)
    一个类代表了整个系统
  • 蝇量模式(Flyweight)
    细粒度的用来高效共享的实例
  • 私有类数据模式(Private Class Data)
    控制数据访问
  • 代理模式(Proxy)
    用一个对象去代指另一个对象

行为类设计模式

行为类设计模式(Behavioral Design Patterns)主要关心的是对象之间的通信。

  • 责任链模式(Chain of Responsibility)
    一种在对象链之间传递请求的方式
  • 命令模式(Command)
    将一种命令(方法)封装成一个对象
  • 翻译者模式(Interpreter)
    一种将自然语言包含进来的方式
  • 迭代器模式(Iterator)
    有序地遍历一个集合的元素
  • 中介者模式(Mediator)
    在不同对象间建立一种更简便的交流方式
  • 备忘录模式(Memento)
    捕捉并存储对象的内部状态
  • 空对象模式(Null Object)
    作为默认(值)对象去使用
  • 观察者模式(Observer)
    一种将变化通知到一组对象的方式
  • 状态模式(State)
    当对象的状态改变时改变它的行为
  • 策略模式(Strategy)
    将一种算法封装到一个类里
  • 模板方法模式(Template Method)
    将一个算法的某些步骤推迟到子类中实现
  • 访问者模式(Visitor)
    不改变类的前提下为其增加新的行为

相关评论

设计模式的概念在计算机科学领域受到了批评。

错设了靶心

设计模式的出现是为了弥补计算机语言或技术抽象能力的不足。理想的情况下,一个概念不应该被重复,而只应该被引用。但如果只引用不复制,就没有所谓”模式”的概念了。保罗·格雷厄姆(Paul Graham)写过一篇相关评论:《书呆子的复仇》 。

彼得·诺维德(Peter Norvig)提出了一个类似的观点。他用Lisp和Dylan通过其语言自带的特性将一本设计模式书(C++语言)里的23种设计模式中的16种做了简化或去除。

缺少根基

对于设计模式的研究有过很多的讨论,有些人认为这个概念迫切地需要建立在一个更加正式的基础上。在1999年OOPSLA (Object-Oriented Programming, Systems, Languages & Applications)的会议上,在他们的全力配合下,“四人帮”(Gang of Four,《设计模式:可复用面向对象软件的基础》一书的四位作者)受到了”审判”。他们被指控犯有多项危害计算机科学的罪行。2/3的”陪审员”认为他们”有罪”。

低效

设计模式是为了将已经经过验证的解决方案标准化。原则上应该更高效,但有时候会引来重复的代码。几乎总有比”刚刚好可以套用”的设计模式更有效的解决方案。

跟其他的抽象概念没有显著的差异

有些作者声称设计模式跟其他抽象的概念比起来没有显著的差异,并且用一个新的术语——从建筑领域借来的——来描述已经存在的现象是没有必要的。早几年,MVC模式被吹捧为”模式的典范”。设计模式社区的主要贡献者(包括”四人帮”)对于用亚历山大的模式语言作为基本格式做了进一步的讨论,这种现象在文献领域是不多见的。


延伸阅读(译者添加)

  • 《书呆子的复仇》一文在《黑客与画家》一书中有收录
  • “四人帮设计模式”:Wiki

加入讨论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据