设计模式概述
设计模式(Design Pattern)是人们在长期的软件开发中对一些经验的总结,是对特点问题经过实践检验的特定解决方法。就像兵法中的三十六计,总结了多种对战争中某些特定的可能性计谋战术。设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术方案总结成设计模式,也会是其他开发者更加容易理解其设计思路。设计模式是可复用的面向对象软件的基础,帮助开发者做出有利于系统复用的选择,避免损害系统复用性的设计。简言之,设计模式可以帮助设计者更快、更好地完成系统设计。
目前所说的设计模式通常是指GoF设计模式。GoF(Gang of Four,四人组)指的是Design Pattern: Elements of Reusable Object-Oriented Software 这本书的4位作者:Gamma、Helm、Johnson和Vlissides,书中总结了23种经典设计模式,因此也被称为GoF设计模式。
这23种设计模式有两种分类方式
(1)根据目的划分,即根据设计模式是用于完成何种工作来划分。这种方式可分为创建型模式、结构型模式和行为型模式3种
- 创建型模式:用于描述“如何创建对象”,其主要特点是“将对象的创建与使用分离”。
- 结构型模式:用于描述如何将类或对象按某种布局组成更大的结构。
- 行为型模式:用于描述类或对象之间如何相互协作,共同完成单个对象无法独立完成的任务,以及如何分配职责。
(2)根据作用范围划分,即根据设计模式主要作用于类上还是主要作用于对象上来划分。这种方式可分为类模式和对象模式两种。
- 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。
- 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时是可以变化的,更具有动态性。
范围\目的 | 创建型模式 | 结构型模式 | 行为型模式 |
类模式 | 工厂方法 |
(类)适配器 |
模板方法 |
对象模式 | 单例 原型 抽象工厂 建造者 |
代理 (对象)适配器 桥接 装饰 外观 享元 组合 |
策略 命令 职责链 状态 观察者 中介者 迭代器 访问者 备忘录 |
面向对象设计原则
1.单一职责原则
单一职责原则规定一个类应该有且仅有一个引起它变化的原因,简单来说,一个类应该只负责应该职责;否则,类应该被拆分。
2.开闭原则
开闭原则是面向对象设计模式中最基础的设计原则,开闭原则规定一个软件实体,如类、模块和函数,应该对拓展开发,对修改关闭(在不修改原有代码的情况下增加新的功能)。
3.里氏替换原则
里氏替换原则是面向对象设计的基本原则之一,是继承复用的基石。该原则规定所有引用基类的地方必须透明地使用其子类的对象。
4.依赖倒置原则
依赖倒置原则的核心思想是:依赖于约定而不依赖于具体实现,即面向接口编程。对象的依赖关系有3种传递依赖方式。(Spring中将依赖对象通过构造注入和setter注入)
- 通过构造方法传递依赖对象,即构造方法的参数是需要依赖的接口类型
- 通过setter方法传递依赖对象,即setter方法的参数是需要依赖的接口类型
- 接口声明依赖,即接口方法的参数是需要依赖的接口类型
如果开闭原则是面向对象设计的目标,那么依赖倒置原则就是实现开闭原则的重要途径之一,他降低了客户与实现模块之间的耦合。
5.接口隔离原则
接口隔离原则要求尽量将庞大臃肿的接口拆分成更小、更具体的接口,让接口中只包含客户感兴趣的方法。
- 单一职责原则注重的是职责,而接口隔离原则则注重接口依赖的隔离
- 单一职责原则主要是约束类,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建
6.迪米特法则
迪米特法则又称为最少知道原则,是指一个软件实体应当尽可能少地与其他实体发生相互作用。
7.合成复用原则
合成复用原则是指:尽量使用组件/聚合的方式,而不是继承关系达到软件复用的目的。