23种设计模式分类和原则
前言
我们从设计模式的6中原则和3种分类从整体认识下业界关注最多的23种设计模式。
设计模式是什么?
设计模式(Design,DP)是软件界的先辈四人帮(The Gang of Four:Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides)总结出的一套理论,一套可以反复使用的经验。以高内聚低耦合为目标,提高代码的可重用性,增强系统的可维护性。
设计模式的六大原则
下表列出了六大原则的具体中英文名称,提取它们英文名称第一个字母刚好可以组成单词solid,可以作为我们的助记方式。
中文名称 | 英文名称,简称 | 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版》