一、单一职责原则(SRP)
定义:
就一个类而言,应该仅有一个引起它变化的原因。
说明:
如何识别并分离职责:
一般类所谓的职责,指的是完成某项工作或认为所提供的功能,其可由一系列功能函数支持实现;分离职责即可按照分离功能实现的策略进行。
小结:
单一职责看似简单,实则比较复杂,其主要体现在识别职责、分离职责,以及确定何时才有必要执行职责分离。
二、开放-封闭原则(OCP)
定义:
软件实体(类、模块、函数等)应是可扩展的,但是不可修改的。
说明:
如何实现开放封闭:
模块应该依赖于抽象接口,而不是具体的类;这样可使得通用部分保持不变,而实现细节部分可以任意修改,也即是抽象接口来实现封闭,而具体实现细节可以保持扩展。
小结:
虽然开放封闭原则虽然也简单,但是从本质上来说几乎很难真正做到完全封闭;另外对于开放封闭,设计人员需要对其模块设计时需要确定哪些变化封闭,也即是需要确定可能发生变化的种类并构造抽象来隔离变化,这些需要设计人员的经验、常识等。
OCP的代价可能是需要花费一定的时间和精力来发现并创建抽象,另外抽象也会增加一定的软件复杂性,故应针对确定可能发生的变化或者发生变化时来执行OCP原则。
OCP作为面向对象设计的核心,带来灵活可扩展、可重用、可维护的好处,但建议应该在真正需要应对频繁变化的地方做出必要的抽象即可,避免复杂度上升。
三、里氏替换原则(LSP)
定义:
子类型必须能够替换它们的基类型。
说明:
如何实现里氏替换原则:
基于开放封闭原则,即抽象与多态,另外还有其他的约束规范,使得子类替换基类时行为上不会发生变化。
小结:
类似于OCP、SRP原则,LSP原则也应该仅对可预测的比较明显违背LSP原则的情况进行处理,而不是对所有的情况都按照LSP原则的要求,以避免不必要的复杂度上升。
对于违反了里氏替换原则的情况下,基本上也违背了OCP原则。
四、依赖倒置原则(DIP)
定义:
高层模块不应该依赖于底层模块,两者均应依赖于抽象;抽象不应该依赖于细节,细节应依赖于抽象。
说明:
小结:
一般的说法是,若程序是按照依赖关系倒置的,则它就是面向对象的设计;否则可能就是面向过程的设计。
依赖倒置原则使得抽象与实现细节彼此隔离,且作为框架设计中的技术原则,更容易维护、扩展。
五、接口隔离原则(ISP)
定义:
不应该让用户依赖于他们不需要的方法或接口。
说明:
解决接口隔离的方法(或者称为避免出现胖接口直接依赖的方法):
针对以上两种方式,可以认为均为适配器的设计模式实现,方法1为基于组合对象适配器,方法2为基于类继承的适配器。方法1会有额外的对象调用间接性增加了一定的内存和调用时间开销。方法1和方法2产生的胖类(多继承的或组合的类)不被外部所依赖。
小结:
针对胖接口,可以直接根据客户分组分类,剥离为多个接口;或者针对客户需要,用新的接口来包裹调用胖接口,避免客户直接与胖接口打交道。这样胖接口的改变不会影响到客户使用,同样客户依赖的接口改变也可以与胖接口独立变化不会产生直接影响。
接口隔离原则要求,设计者尽量不要出现胖接口,另外对于已有的胖接口,也不要直接与胖接口产生直接依赖。
六、迪米特法则(最少知道原则)(LoD)
定义:
对象之间应尽可能少的了解对象。
说明:
小结:
迪米特法则导致类间的交互通信不够直接,可能导致较多的中介者(第三者)来转发请求以及会有不同类对象间的通信、交互、效率等问题。
迪米特法则可最大限度的减低类之间的耦合,有利于信息隐藏和复用。
七、组合复用原则(CRP)
优先使用组合而不是继承。
原文:https://www.cnblogs.com/haomiao/p/11663021.html