设计模式学习笔记

  1. 依赖倒置原则DIP

    1.1 依赖倒置原则,英文缩写DIP,全称Dependence Inversion Principle.

    1.2 原始定义:

    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 abstractions.

    1.3 官方翻译:

    高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象.

    1.4 实践:

    把存在多种实现的功能提取成接口,新增模块只需要新增一个接口实现即可.一个违反依赖倒置原则DIP的设计:多个实现揉和在一个方法中,使用参数进行逻辑判断使用哪种实现.

  2. 单一职责原则SRP

    2.1 单一职责原则,英文缩写SRP,全称Single Responsibility Principle.

    2.2 原始定义:

    There should never be more than one reason for a class to change.

    2.3 官方翻译:

    应该有且仅有一个原因引起类的变更.简单点说,一个类,最好只负责一件事,只有一个引起它变化的原因.

    2.4 实践:

    有点E-R图分解的赶脚,按照功能进行分解成多个类,每个类负责的事情在需求上会属于同一范畴,某一范畴的变动不应该对其他类进行变动.

  3. 接口隔离原则ISP

    3.1 接口隔离原则,英文缩写ISP,全称Interface Segregation Principle.

    3.2 原始定义:

    Clients should not be forced to depend upon interfaces that they don’t use,

    还有一种定义是:

    The dependency of one class to another one should depend on the smallest possible interface.

    3.3 官方翻译:

    其一是不应该强行要求客户端依赖于它们不用的接口;其二是类之间的依赖应该建立在最小的接口上面.

    简单点说,客户端需要什么功能,就提供什么接口,对于客户端不需要的接口不应该强行要求其依赖;

    类之间的依赖应该建立在最小的接口上面,这里最小的粒度取决于单一职责原则的划分.

    3.4 实践:

    接口尽量细化,同时``接口中的方法尽量少,提供给每个模块的都应该是单一接口,提供给几个模块就应该有几个接口,而不是建立一个庞大的臃肿的接口,容纳所有的客户端访问.

    接口是我们设计时对外提供的契约,通过分散定义多个接口,可以预防未来变更的扩散,提高系统的灵活性和可维护性.

  4. 开闭原则OCP

    4.1 开闭原则,英文缩写OCP,全称Open Closed Principle.

    4.2 原始定义:

    Software entities (classes, modules, functions) should be open for extension but closed for modification.

    4.3 字面翻译:

    软件实体(包括类、模块、功能等)应该对扩展开放,但是对修改关闭.

    4.3 实践:

    在软件的迭代过程中,通过扩展可以解决的问题尽量不进行修改源代码以减少风险的发生.所以设计之处要考虑实现抽象,给扩展预留口子.

  5. 里氏替换原则LSP

    5.1 原始定义:

    If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged where o1 is substituted for o2 then S is a subtype of T。 (Functions that use pointers or references to base classes must be able to use object of derived classes without knowing it)

    5.2 翻译:

    如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时, 程序P的行为没有变化,那么类型T2是类型T1的子类型.

    换言之,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别.

    子类可以扩展父类的功能,但不能改变父类原有的功能

    5.3 规则:

     1. 子类必须完全实现父类的方法
     2. 子类可以有自己的个性
     3. 覆盖或实现父类的方法时输入参数可以被放大
    

    5.4 实践:

    在设计上,子类的变更不能改变原有的功能,即要保证派生类(子类)对象能够替换其基类(超类)对象被使用.

面向对象编程OOP

通过基本的了解会发现各个原则之间是有类似的地方的.不过设计原则没有绝对的界限,它们只是从不同的侧重点去约束我们的软件架构,使其能使用各种不同的需求.

引用

  1. 面向对象设计-里氏替换原则(LSP)
  2. 小话设计模式原则之:依赖倒置原则DIP