1、设计模式概念
软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。
设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。正确使用设计模式具有以下优点。
- 可以提高程序员的思维能力、编程能力和设计能力。
- 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
- 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。
2、设计原则
- 单一职责原则:一个类只干一件事,实现类要单一。
- 接口隔离原则:一个接口只干一件事,接口要精简单一。
- 依赖倒转原则:高层不应该依赖低层,要面向接口编程。
- 里氏替换原则:不要破坏继承体系,子类重写方法功能发生改变,不应该影响父类方法的含义。
- 开闭原则:对扩展开放,对修改关闭。
- 迪米特法则:一个对象应该对其他对象保持最小的了解,尽量降低类与类之间的耦合。又叫最少知道原则。
- 合成复用原则:尽量使用对象组合(has-a)、聚合(contains-a),而不是继承关系(is-a)达到软件复用的关系。
3、UML类图
UML类图展现了一组对象、接口、协作和它们之间的关系。
按类与类之间关系的紧密程度从弱到强划分,类与类之间的关系包括:
- 依赖:一个类必须依赖另一个类存在。
- 关联:关联关系表示两个类之间存在一种结构关系,这种关系比依赖关系更紧密。关联可以有方向,可以是单向关联,也可以是双向关联。
- 聚合(has-a):一种特殊的关联,聚合表示整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。
- 组合(contains-a):一种特殊的关联,也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。
- 实现:接口的实现。
- 继承(泛化):类的继承关系。
4、设计模式分类
创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。
- 单例模式:保证一个类仅有一个实例,并且提供一个全局访问点。
- 抽象工厂模式:不同条件下创建不同实例。
- 工厂方法模式:不同条件下创建不同实例。
- 原型模式:通过拷贝原型创建新的对象。
- 建造者模式:用来创建复杂的复合对象。
结构型模式:把类或对象结合在一起形成一个更大的结构。
- 适配器模式:将原来不兼容的两个类融合在一起。
- 桥接模式:将两个能够独立变化的部分分离开来。
- 装饰模式:为对象添加新功能。
- 组合模式:将整体与局部(树形结构)进行递归组合,让客户端能够以一种的方式对其进行处理。
- 外观模式:对外提供一个统一的接口用来访问子系统。
- 亨元模式:使用对象池来减少重复对象的创建。
- 代理模式:为其他对象提供一种代理以控制对这个对象的访问。
行为型模式:类和对象如何交互,及划分责任和算法。
- 模板方法模式:定义一套流程模板,根据需要实现模板中的操作。
- 命令模式:将请求封装成命令,并记录下来,能够撤销与重做。
- 访问者模式:稳定数据结构,定义新的操作行为。
- 策略模式:封装不同的算法,算法之间能互相替换
- 状态模式:根据不同的状态做出不同的行为。
- 观察者模式:状态发生改变时通知观察者,一对多的关系。
- 备忘录模式:保存对象的状态,在需要时进行恢复。
- 中介者模式:将对象之间的通信关联关系封装到一个中介类中单独处理,从而使其耦合松散。
- 迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素。
- 解释器模式:给定一个语言,定义它的语法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。
- 责任链模式:拦截的类都实现统一接口,每个接收者都包含对下一个接收者的引用。将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
参考设计模式