设计模式

What?什么是设计模式?

设计模式是对面向对象设计中反复出现问题的解决方案

Why?问什么要用设计模式?

设计模式是对面向对象设计中反复出现问题的解决方案

设计模式7大原则

  • 开放封闭原则 OCP(Open Close Principle)

    • 由”Bertrand Meyer”提出的。Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification
    • 面向扩展开放(Open For Extension),也就是说模块的行为是能够被扩展的。当应用程序的需求变化时,我们可以使模块表现出全新的或与以往不同的行为,以满足新的需求
    • 面向修改封闭(Closed For Modification),模块的源代码是不能被侵犯的,任何人都不允许修改已有源代码
    • 看起来两个特性是冲突的,通常扩展一个模块的功能就是修改它的代码,而一个不被经常修改的模块的功能是相对固定的
    • 抽象(Abstract)是将此两种冲突的特性相结合的关键
  • 依赖倒置原则 DIP(Dependency Inversion Principle)

    • 高层模块不应该依赖于低层模块,二者都应该依赖于抽象。High level modules should not depend upon low level modules. Both should depend upon abstractions
    • 抽象不应该依赖于具体实现细节,而具体实现细节应该依赖于抽象。Abstractions should not depend upon details. Details should depend upon abstraction
    • 依赖倒置原则是很多面向对象技术的根基。它特别适合应用于构建可复用的软件框架,其对于构建弹性地易于变化的代码也特别重要。并且,因为抽象和细节已经彼此隔离,代码也变得更易维护
  • 单一职责原则 SRP(Single Responsibility Principle)

    • 一个类应该有且只有一个变化的原因。There should never be more than one reason for a class to change
    • 不仅仅是类,每个函数也都应该只负责一个具体的功能
  • 接口分离原则 ISP(The Interface Segregation Principle)

    • 子类不应被强迫实现那些它们不需要的接口。Clients should not be forced to depend upon interfaces that they do not use
    • 接口污染(Interface Pollution)是指一个基类包含了非必要的接口,接口污染与接口分离相互对立
    • 解决接口污染的方案
      • 通过委托进行分离(Separation through Delegation)
      • 通过多继承进行分离(Separation through Multiple Inheritance)
    • 胖接口使本应该被隔离的客户类之间产生了耦合。通过应用 Adapter 设计模式,采用委托(delegation)或多继承方式,胖接口可以被分离成多个抽象的基类接口,从而打破客户类之间的不必要的耦合
  • 里氏代换原则 LSP(Liskov Substitution Principle)

    • 使用基类对象指针或引用的函数必须能够在不了解衍生类的条件下使用衍生类的对象。Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it
    • 如若可以成功调用一个父类对象的函数,那么把父类对象替换成子类对象,调用依然可行
    • 里氏替换原则(Liskov Substitution Principle)则是实现 OCP 原则的重要方式。只有当衍生类能够完全替代它们的基类时,使用基类的函数才能够被安全的重用,然后衍生类也可以被放心的修改了
  • 最少知识原则 LKP(Least Knowledge Principle)- 迪米特法则(Law of Demeter)

    • 类应该与其协作类进行交互但无需了解它们的内部结构。A class should interact directly with its collaborators and be shielded from understanding their internal structure
    • 现代面向对象程序设计语言通常使用”.”作为访问标识,LoD 可以被简化为”仅使用一个点(use only one dot)”
    • 优点:遵守 Law of Demeter 将降低模块间的耦合,提升了软件的可维护性和可重用性。
    • 缺点:应用 Law of Demeter 可能会导致不得不在类中设计出很多用于中转的包装方法(Wrapper Method),这会提升类设计的复杂度。
  • 合成复用原则 CRP(Composite Reuse Principle)

    • 在模块复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现
    • 如果两个类之间是“Has-A”的关系应使用组合或聚合,如果是“Is-A”关系可使用继承
    • 修改基类某些代码会导致所有的子类都需要修改,从而带来了不必要的风险

设计模式

  • 创建型 (Creational) 模式

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

    • 适配器模式 - Adapter
    • 桥接模式 - Bridge
    • 组合模式 - Composite
    • 装饰模式 - Decorator
    • 外观模式 - Facade
    • 享元模式 - Flyweight
    • 代理模式 - Proxy
  • 行为型 (Behavioral) 模式

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