Kyle's Notebook

设计模式与设计原则

Word count: 1kReading time: 3 min
2019/12/05

总结常用的设计模式及六大设计原则,附上代码实现以及应用实例以供参考。

建议在 PC 端打开本文,可查看脑图每个节点的笔记。

设计模式

创建型模式

  • 单例模式(Singleton)

  • 简单工厂模式(Simple Factory)

  • 工厂方法模式(Factory Method)

  • 抽象工厂模式(Abstract Factory)

  • 建造者模式(Builder)

  • 原型模式(Prototype)

结构型模式

  • 适配器模式(Adapter)

  • 桥接模式(Bridge)

  • 组合模式(Composite)

  • 装饰器模式(Decorator)

  • 外观模式(Facade)

  • 享元模式(Flyweight)

  • 代理模式(Proxy)

行为型模式

  • 责任链模式(Chain Of Responsibility)

  • 命令模式(Command)

  • 解释器模式(Interpreter)

  • 迭代器模式(Iterator)

  • 中介者模式(Mediator)

  • 备忘录模式(Memento)

  • 观察者模式(Observer)

  • 状态模式(State)

  • 策略模式(Strategy)

  • 模板方法模式(Template Method)

  • 访问者模式(Visitor)

  • 空对象模式(Null)

六大设计原则

单一职责原则(Single Responsibility Principle)

一个类或接口只负责一项职责/操作,目的在于:

  • 降低复杂度。

  • 提高可读性、可维护性。

  • 降低变更引起的风险。

如果一个类负责多个职责,其中一项发生变化就要修改整个类,可能会导致其他职责运行错误。对于一个类,引起它变化的原因只应该只有一个。

里氏替换原则(Liskov Substitution Principle)

引用基类的地方必须能透明地使用其子类的对象(使用基类定义,运行时使用子类对象):

  • 子类可实现父类抽象方法,但不能覆盖父类非抽象方法。

  • 子类中可扩增自己特有的方法。

  • 子类方法重载父类方法时,入参要比父类方法入参更宽松。

依赖倒置原则(Dependence Inversion Principle)

  • 抽象不应依赖细节,细节应依赖抽象(针对接口而非实现编程)。

  • 传递参数或在关联关系中,尽量引用层次高的抽象层类。

即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,需要注意:

  • 每个类尽量都有接口或抽象类,或两者都具备。

  • 变量的表名类型尽量是接口或者抽象类。

  • 尽量不要覆写基类的方法。

  • 结合里氏替换原则使用。

接口隔离原则(Interface Segregation Principle)

  • 客户端不应依赖它不需要的接口,一个类对另一个类的依赖建立在最小的接口上。

  • 当接口太大时,需要将它分割成更细小的接口(承担相对独立的角色),使用该接口的客户端仅需知道与之相关的方法。

  • 要求控制接口的粒度:

    • 接口太小会导致系统中接口泛滥,不利于维护。
    • 接口太大将违背接口隔离原则,灵活性较差,使用起来很不方便。

迪米特原则(Law of Demeter)

  • 对象应该对其他对象有最少的了解。

  • 类应对耦合或调用的类知道得最少,尽量减少对象之间的交互。

  • 如两个对象之间不必彼此直接通信,这两个对象就不应当发生任何直接的相互作用。

  • 如果其中的一个对象需要调用另一个对象的某个方法,可通过第三者转发该调用。

  • 在代理模式和外观模式中都有体现这个原则。

开闭原则(Open Closed Principle)

  • 软件实体应通过扩展(对扩展开放)而非修改已有的代码来实现变化(对修改关闭)。

  • 设计软件系统模块(类,方法)时,应在不修改原有的模块(修改关闭)的基础上扩展其功能(扩展开放)。

  • 优势在于软件系统可复用,并且易于维护:

    • 稳定性:扩展功能不修改原来的代码,这可以让软件系统在变化中保持稳定。
    • 扩展性:对扩展开放,通过扩展提供新的或改变原有的功能,让软件系统具有灵活的可扩展性。
CATALOG
  1. 1. 设计模式
    1. 1.0.1. 创建型模式
    2. 1.0.2. 结构型模式
    3. 1.0.3. 行为型模式
  2. 1.1. 六大设计原则
    1. 1.1.1. 单一职责原则(Single Responsibility Principle)
    2. 1.1.2. 里氏替换原则(Liskov Substitution Principle)
    3. 1.1.3. 依赖倒置原则(Dependence Inversion Principle)
    4. 1.1.4. 接口隔离原则(Interface Segregation Principle)
    5. 1.1.5. 迪米特原则(Law of Demeter)
    6. 1.1.6. 开闭原则(Open Closed Principle)