概述
设计模式(design pattern)是对软件设计中普遍存在的各种问题,所提出的解决方案。设计模式并不是固定的一套代码,而是针对某一特定问题的具体解决思路与方案。可以认为是一种最佳实践,因为它是无数软件开发人员经过长时间的实践总结出来的。
软件领域的「四人帮」编写了著名的《设计模式:可复用面向对象软件的基础》一书,总结了23种设计模式,并将其进行分类。
设计模式原则
1. 单一职责原则
单一原很简单,就是将一组相关性很高的函数、数据封装到一个类中。换句话说,一个类应该职责单一。
2. 开闭原则
开闭原则是指一个类应该对于扩展是开放的,但是对于修改是封闭的。
在开放的app或者是系统中,经常需要升级、维护等,这就要对原来的代码进行修改,可是修改时容易破坏原有的系统,甚至带来一些新的难以发现的BUG。因此,我们在一开始编写代码时,就应该注意尽量通过扩展(抽象类、接口)的方式实现新的功能,而不是通过修改已有的代码实现。
3. 里氏替换原则
里氏替换原则是指:任何基类可以出现的地方,子类一定可以出现。其本质是说,要好好利用继承和多态。简单地说,就是以父类的形式声明的变量(或形参),赋值为任何继承于这个父类的子类后不影响程序的执行。
里氏替换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏替换原则是对实现抽象化的具体步骤的规范。
4. 依赖倒置原则
这个原则是指:针对接口(抽象类)编程,依赖于抽象而不依赖于具体。
依赖倒置主要是实现解耦,使得高层次的模块不依赖于低层次模块的具体实现细节。
在 Java 语言中,抽象就是指接口或者抽象类,二者都是不能直接被实例化;细节就是实现类,实现接口或者继承抽象类而产生的类,就是细节。使用 Java 语言描述就简单了:就是各个模块之间相互传递的参数声明为抽象类型,而不是声明为具体的实现类。
5. 接口隔离原则
接口隔离原则定义:类之间的依赖关系应该建立在最小的接口上。其原则是将非常庞大的、臃肿的接口拆分成更小的更具体的接口。
6. 迪米特原则
定义:一个对象应该对其他的对象有最少的了解。
什么意思呢?就是说一个类应该对自己调用的类知道的最少。还是不懂?其实简单来说:假设类 A 实现了某个功能,类 B 需要调用类 A 的对象去执行这个功能,那么类 A 应该只暴露一个函数给类 B,这个函数表示是实现这个功能的函数,而不是让类 A 把实现这个功能的所有细分的函数暴露给 B。
设计模式的分类
23 种设计模式可以分为 3 类:
- 创建型模式:与对象的创建有关。
- 结构性模式:处理类与对象的组合。
- 行为性模式:对类或对象怎样交互和怎样分配职责进行描述
创建型模式:单例模式(Singleton)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)、工厂模式(Factory Method)、原型模式(Prototype)。
结构型模式:适配器模式(Adapter)、桥接模式(Bridge)、装饰者模式(Decorator)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)、代理模式(Proxy)。
行为型模式:模版方法模式(Template Method)、命令模式(Command)、迭代器模式(Iterator)、观察者模式(Observer)、中介者模式(Mediator)备忘录模式(Memento)、解释器模式(Interpreter)、状态模式(State)、策略模式(Strategy)、责任链模式(Chain of Responsibility)、访问者模式(Visitor)。