23种设计模式总览
设计模式(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)
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
- 开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。
设计原则核心思想
- 找出应用中可能需要变化之处,把他们独立出来不要和那些不需要变化的代码混在一起
- 针对接口编程,而不是针对实现编程
- 为了交互对象之间的松耦合设计而努力
设计模式之间的关系图
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 南山结庐!
评论