设计模式【00】总论

设计模式【00】总论

什么是设计模式

在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。四位作者合称 GOF(*,Gang of Four)。他们所提出的设计模式主要是基于以下的面向对象设计原则。

  • 对接口编程而不是对实现编程。
  • 优先使用对象组合而不是继承。

设计模式(Design Pattern)是软件开发人员在软件开发过程中面临的一般问题的解决方案。这是前辈们积累总结的精华。在软件开发进阶的道路上,咱们或多或少肯定接触过一些,本系列将对23种设计模式逐一整理学习。如果你也刚好想了解了解设计模式,那就快来和笔者一起学习吧。

设计模式的灵魂——SOLID设计原则

现在软件开发基本都是面向对象设计(OOD,Object-Oriented Design)和面向对象编程(OOP,Object-Oriented Programming),而SOLID设计原则就是OOD、OOP以及23种设计模式的灵魂。
那么什么是SOLID呢?其实,它是SRP、OCP、LSP、ISP、DIP五个缩略词的首字母组合。下面让我们来揭开它神秘的面纱。

SRP单一职责原则

SRP单一职责原则(Single Responsibility Principle),一个类应该仅有一个引起变化的原因。简单的来说,就是一个类中应该是一组相关性很高的函数、数据的封装。
职责的划分包含很多人为因素。在实际项目中,我们保证接口职责单一,类的职责尽量单一即可。

OCP开闭原则

OCP开闭原则(Open Close Principle),软件中的对象 (类、模块、函数等) 应该对于扩展是开放的,但是,对于修改是封闭的。

LSP里氏替换原则

LSP里氏替换原则(The Liskov Substitution Principle),关注的是怎样良好地使用集成。
Liskov于1987年提出了一个关于继承的原则"Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.(继承必须确保父类所拥有的性质在子类中仍然成立)"也就是说,当一个子类的实例应该能够替换其父类的任何实例时,它们之间才具有is-A关系。
该原则称为Liskov Substitution Principle——里氏替换原则。

ISP接口隔离原则

ISP接口隔离原则(Interface Segregation Principle),即不应该强迫客户程序依赖它们不需要使用的方法。
接口隔离原则的目的是系统解耦,从而容易重构、更改和重新部署。
在实际项目中,应该注意度的把握,接口设计得过大或过小都不好,应该根据实际情况多思考再进行设计。

DIP依赖倒置原则

DIP依赖倒置原则(Dependence Inversion Principle),即高层模块不应该依赖底层模块,两者都应该依赖于抽象,而抽象不应该依赖细节,细节应该依赖抽象。
在使用DIP原则时需要注意以下几点:

  1. 继承自高层接口的类要实现接口中的所有方法。
  2. 尽量不要覆盖继承的抽象类的方法,由于我们依赖的是抽象,有可能逻辑中已经对这些方法产生了依赖,因此如果覆盖这些方法则有可能出现问题。
  3. DIP原则是实现OCP原则的重要保障,一般违背了DIP原则很难不违背OCP原则。
  4. LSP原则是实现DIP原则的基础,多态为实现DIP原则提供了可能。

LOD迪米特原则

除了上述SOLID五个设计原则外,还有第六个规则。

迪米特原则英文的全称为 Law of Demeter , 缩写是 LOD , 也称为最少知识原则。

即:一个对象应该对其他对象有最少的的了解

一个类应该对自己需要耦合或调用的类知道的最少,类与类之间的关系越密切,耦合度越大,那么类的变化对其耦合的类的影响也会越大,这也是我们面向设计的核心原则:低耦合,高内聚。

设计模式的类型

根据设计模式的参考书 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 中所提到的,总共有 23 种设计模式。这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。当然,我们还会讨论另一类设计模式:J2EE 设计模式。

创建型模式

这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。

(5种)(记忆口诀:单原建造者,东西二厂)

  1. 单例模式(Singleton Pattern)
  2. 原型模式(Prototype Pattern)
  3. 建造者模式(Builder Pattern)
  4. 工厂模式(Factory Pattern)
  5. 抽象工厂模式(Abstract Factory Pattern)

结构型模式

这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。

(7种)(记忆口诀:一器一桥一元一代理;装饰组合外观)

  1. 适配器模式(Adapter Pattern)
  2. 桥接模式(Bridge Pattern)
  3. 享元模式(Flyweight Pattern)
  4. 代理模式(Proxy Pattern)
  5. 装饰模式(Decorator Pattern)
  6. 组合模式(Composite Pattern)
  7. 外观模式(Facade Pattern)

行为型模式

这些设计模式特别关注对象之间的通信。

(11种)(记忆口诀:三者两器、一录一链一模板,状态策略命令)

  1. 观察者模式(Observer Pattern)
  2. 中介者模式(Mediator Pattern)
  3. 访问者模式(Visitor Pattern)
  4. 解释器模式(Interpreter Pattern)
  5. 迭代器模式(Iterator Pattern)
  6. 备忘录模式(Memento Pattern)
  7. 责任链模式(Chain of Responsibility Pattern)
  8. 模板模式(Template Pattern)
  9. 状态模式(State Pattern)
  10. 策略模式(Strategy Pattern)
  11. 命令模式(Command Pattern)

J2EE 模式

这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。

  1. MVC 模式(MVC Pattern)
  2. 业务代表模式(Business Delegate Pattern)
  3. 组合实体模式(Composite Entity Pattern)
  4. 数据访问对象模式(Data Access Object Pattern)
  5. 前端控制器模式(Front Controller Pattern)
  6. 拦截过滤器模式(Intercepting Filter Pattern)
  7. 服务定位器模式(Service Locator Pattern)
  8. 传输对象模式(Transfer Object Pattern)

设计模式之间的关系

设计模式【00】总论

参考资料

Android设计模式之23种设计模式一览
通过代码示例来学习面向对象六大原则

感谢您阅读本文,希望能在微信公众号(见下方二维码)、掘金简书CSDN一起交流。

设计模式【00】总论