设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了更好的代码可重用性可读性可靠性可维护性

设计模式3大分类

创建型模式(5种)

  • 单例模式(Singleton Pattern)
  • 工厂方法模式(Factory Method Pattern)
  • 抽象工厂模式(Abstract Factory Pattern)
  • 建造者模式(Builder Pattern)
  • 原型模式(Prototype Pattern)

结构型模式(7种)

  • 适配器模式(Adapter Pattern)
  • 装饰者模式(Decorator Pattern)
  • 代理模式(Proxy Pattern)
  • 外观模式(Facade Pattern)
  • 桥接模式(Bridge Pattern)
  • 组合模式(Composite Pattern)
  • 享元模式(Flyweight Pattern)

行为型模式(11种)

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

设计模式6大原则

单一职责原则(Single Responsibility Principle, SRP)

就一个类而言,应该只有一个引起它变化的原因。

  • 降低类的复杂度,一个类只负责一项职责;
  • 提高类的可读性和可维护性;
  • 降低变更引起的风险。

里氏替换原则(Liskov Substitution Principle, LSP)

所有引用基类(父类)的地方必须能透明地使用其子类的对象。

  • 里氏替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。
  • 任何基类可以出现的地方,子类一定可以出现。里氏替换原则是继承复用的基石,只有当衍生类可以替换基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

依赖倒转原则(Dependence Inversion Principle, DIP)

抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。

  • 在实现依赖倒转原则时,我们需要针对抽象层编程,而将具体类的对象通过依赖注入(DependencyInjection, DI)的方式注入到其他对象中,依赖注入是指当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象。
  • 常用的注入方式有三种,分别是:构造注入设值注入(Setter注入)接口注入。构造注入是指通过构造函数来传入具体类的对象,设值注入是指通过 Setter 方法来传入具体类的对象,而接口注入是指通过在接口中声明的业务方法来传入具体类的对象。这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。

接口隔离原则(Interface Segregation Principle, ISP)

使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

  • 每个接口中不存在子类用不到却必须实现的方法,若存在,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。

迪米特法则(Demeter Principle, DP)

一个软件实体应当尽可能少地与其他实体发生相互作用。

  • 迪米特法则又称为最少知识原则(Least Knowledge Principle, LKP)。一个类对自己依赖的类知道的越少越好。无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过 public 方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。

开闭原则(Composite Reuse Principle, CRP)

一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

  • 开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。

设计原则核心思想

  1. 找出应用中可能需要变化之处,把他们独立出来不要和那些不需要变化的代码混在一起
  2. 针对接口编程,而不是针对实现编程
  3. 为了交互对象之间的松耦合设计而努力

设计模式之间的关系图

设计模式之间的关系