一个计算机技术爱好者与学习者

0%

设计模式概述

1. 设计模式简介

1979年,建筑师亚历山大编写了《建筑的永恒之道》,这本书阐述了建筑与规划的新观点。作者通过对当代建筑的研究发现:优秀的建筑中,总是存在着一些相似之处。如果能够找出这些优秀建筑的特征,就能够找到这些建筑是采用了哪些方法,如何设计才变得优秀的,从而也就能够客观评价一个建筑设计的好坏。通过找出并掌握这些优秀建筑的设计方法,建筑师就可以把这些方法复制到其他的建筑设计中,从而设计出同样优秀的建筑来。

建筑行业中存在的情况和软件行业存在的情况类似。在软件行业,是否也能够从那些优秀的软件中,找到一些相同的特征、优秀的设计方法,从而使软件开发人员能够掌握这些方法,并将其应用到其他的软件开发中,从而也开发出同样优秀的软件呢?

为了探讨这个问题,很多软件开发人员开始了这方面的研究,其中影响最大的文献是《设计模式》一书,该书的四个作者被称为GoF或Gang of Four。这本书总结了人类历史上软件开发的经验,给出了描述模式的一些特征,并提炼出用于指导软件设计的23种模式和一些面向对象的设计方法。

2. 设计模式分类

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

2.1. 创建型模式

软件设计方面,分工越来越细,因此对象的创建和对象的使用分开也就成了必然趋势。因为对象的创建会消耗很多资源,所以对对象的创建进行研究,能够高效地创建对象就是创建型模式要探讨的问题。
创建型模式有6个:

  • 简单工厂模式(Simple Factory)
  • 工厂方法模式(Factory Method)
  • 抽象工厂模式(Abstract Factory)
  • 创建者模式(Builder)
  • 原型模式(Prototype)
  • 单例模式(Singleton)

2.2. 结构型模式

在解决了对象的创建问题后,对象的组成以及对象之间的依赖关系就成了开发人员关注的焦点,因为如何设计对象的结构、继承和依赖关系会影响后续程序的维护性、代码的健壮性、耦合性等。对象结构的设计很容易体现出设计人员水平的高低。
结构型模式有7个:

  • 外观模式(Facade)
  • 适配器模式(Adapter)
  • 代理模式(Proxy)
  • 装饰模式(Decorator)
  • 桥模式(Bridge)
  • 组合模式(Composite)
  • 享元模式(Flyweight)

2.3. 行为型模式

在对象的创建和对象的结构问题都解决了之后,就剩下对象的行为问题了,如果对象的行为设计的好,那么对象的行为就会更清晰,它们之间的协作效率就会提高。
行为型模式有11个:

  • 模板方法模式(Template Method)
  • 观察者模式(Observer)
  • 状态模式(State)
  • 策略模式(Strategy)
  • 职责链模式(Chain of Responsibility)
  • 命令模式(Command)
  • 访问者模式(Visitor)
  • 调停者模式(Mediator)
  • 备忘录模式(Memento)
  • 迭代器模式(Iterator)
  • 解释器模式(Interpreter)

3. 类之间关系

在面向对象设计模式中,类与类之间主要有6种关系,分别是:依赖、关联、聚合、组合、继承、实现,耦合度依次增强。

  • 依赖,一个类的方法里使用了另一个类。
  • 关联,一个类里包含另一个类作为属性(成员变量)。
  • 聚合,强的关联,整体与个体。
  • 组合,更强的关联,同生共死。
  • 继承
  • 实现

4. staruml逆向问题

使用staruml逆向生成类图的时候,提示错误:“Description: Unrecoverable Parse Error”。

原因1:java文件编码为包含BOM的UTF-8,而BOM在staruml中无法处理。
解决办法:使用格式转换工具,转换为不包含BOM的UTF-8。或者,转换为GB2312。

原因2:java文件中包含@Override等标签,staruml无法识别。
解决办法:去掉标签。或者换用其他逆向工具,比如WhiteStarUML、BOUML、UMLet等。

5. 源码分享

https://github.com/voidking/design.git

6. 参考文献

《易学设计模式》
《大话设计模式》
接口设计六大原则
软件设计六大设计原则讲解
了解这23种设计模式
依赖、关联、聚合和组合及其之间区别的简单理解
StarUML使用说明-指导手册
使用StarUML画类图
UML建模之时序图(Sequence Diagram)