前言

我们从设计模式的6中原则和3种分类从整体认识下业界关注最多的23种设计模式。

设计模式是什么?

设计模式(Design,DP)是软件界的先辈四人帮(The Gang of Four:Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides)总结出的一套理论,一套可以反复使用的经验。以高内聚低耦合为目标,提高代码的可重用性,增强系统的可维护性

设计模式的六大原则

下表列出了六大原则的具体中英文名称,提取它们英文名称第一个字母刚好可以组成单词solid,可以作为我们的助记方式。

image-20211129112124861

中文名称 英文名称,简称 SOLID
单一职责原则 Single Responsibility Principle,SRP S
开闭原则 Open Close Principle O
里氏替换原则 Liskov Substitution Principle,LSP L
迪米特法则,也称最少知识原则 Law Of Demeter,LoD / Least Knowledge Principle,LKP L
接口隔离原则 Interface Segregation Principle I
依赖倒置原则 Dependence Inversion Principle,DIP D

单一职责原则

尽量做到有且仅有一个原因引起类(接口、类、方法)的变更,目的是降低类复杂性,提高可读可维护性,降低类变更产生的风险

承担的职责过多,更新迭代的频率会提高,错综复杂的逻辑增加了理解和维护成本,影响结果的因素变多,小小的修改被迫考虑过多的意外情况。

开闭原则

软件实体如类、模块和函数应该对扩展开放,对修改关闭。通过扩展来实现变化而不是修改已有代码来实现

里氏替换原则

父类出现的地方用子类替换不会产生任何错误和异常,反过则来不一定

最佳实践:①覆盖或者实现父类方法时,子类输入参数表示的范围>=父类,返回类型表示范围<=父类;②在类中调用其他业务时,必须要使用父类或接口。

继承优缺点:①代码共享,子类拥有父类的方法和属性;②提高代码重用性、扩展性,产品开放性开放性;③入侵性强、降低灵活性,只要继承,必须拥有父类属性和方法;④增强耦合,父类修改时要考虑子类的修改。

迪米特法则,也称最少知识原则

一个类应该对自己需要耦合或调用的类知道得最少,只和朋友类交流,减少依赖的类。其他类的内部如何错综复杂不关心,只关心有访问权限的方法(public、protected等)。

最佳实践:①类与类之间的关系是建立在类间的,而不是方法间,因此一个方法尽量不要引入一个类中不存在的对象,JDK API中提供的除外;②尽量控制类方法访问权限,只公开必要的方法。

接口隔离原则

建立单一接口,不建立臃肿庞大接口,接口尽量细化,接口中的方法尽量少。有点像单一职责原则,但两者审视的角度不同,单一职责强调的是职责,是业务逻辑上的划分,而接口隔离要求接口的方法尽量少。

最佳实践:① 接口尽量小,避免臃肿;②接口高内聚(提高接口、类、模块的业务处理能力,减少对外交互);③接口中只提供客户端需要的方法。

依赖倒置原则

更精简定义为—面向接口编程(Object-Oriented Design)。

①依赖倒置高层模块不依赖底层模块,两者都依赖其抽象;②抽象不应该依赖细节;③细节应该依赖抽象。

Java语言中的表现:①模块间依赖通过抽象发生,实现类间依赖通过接口或抽象发生;②接口或抽象不依赖实现类;③实现类依赖接口或抽象。

最佳实践:① 每个类尽量有接口或抽象类,或者两者兼备;② 变量的表面类型尽量是接口或抽象类型;③ 任何类都不应从具体类派生,但不必完全遵循,一般不超两层继承是可以忍受的。维护工作基本通过扩展开发来修复问题,可以忽略此规则;⑤ 尽量不要复写基类的方法;⑥ 结合里式替换原则。

依赖“正置”指类间实实在在的依赖关系,也就是面向实现编程。而面向抽象编程则对现实事物进行抽象,结果就是产生类抽象类和接口,然后根据需要产生了抽象间的依赖,代替了人们传统思维中的事物间的依赖,“倒置”就是从这里产生的。

设计模式的类型

  • 创建型模式5种:关注、解耦对象的实例化过程,提供对象的创建和管理职责

工厂模式(Factory)、抽象工厂模式(Abstract Factory)、单例模式(Singleton)、建造者模式(Builder)、原型模式(Prototype)。

  • 结构性模式7种:关注类和对象的组合,通过组合类或对象产生更大结构以适应更高层次的逻辑需求

适配器模式(Adapter)、桥接模式(Bridge)、过滤器模式(Filter、Criteria)、组合模式(Composite)、装饰器模式(Decorator)、享元模式(Flyweight)、代理模式(Proxy)。

  • 行为型模式11种:关注对象之间的通信,类和对象如何交互,及划分责任和算法

责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式(State)、策略模式(Strategy)、模板模式(Template)、访问者模式(Visitor)

新模式

外观模式(Facade)、空对象模式(Null Object)、规格模式、对象池模式、雇工模式、 黑板模式等。

参考

菜鸟教程 - 设计模式

《设计模式之禅 - 第2版》