设计模式七大原则

面向对象七大设计原则,以及使用到这些原则的设计模式

  • 1.合成/聚合复用原则(CARP) (有些地方,不将其列入设计原则,太过具体): 延伸出更具体的原则:封装变化
  • 2.开放-封闭原则(OCP)
  • 3.依赖倒置原则(DIP)- 延伸出更具体的原则:1. 针对接口编程,不针对实现编程 2.好莱坞原则
  • 4.迪米特法则(LoD)
  • 5.单一职责原则(SRP)
  • 6.里氏代换原则(LSP)
  • 7.接口隔离原则(ISP)

OO原则是我们的目标,设计模式是我们的做法。不过这一切都是为了:松耦合、易复用、方便开发维护

合成/聚合复用原则(CARP) ("有一个"比"是一个"更好)

尽量使用合成/聚合、组合,尽量不要使用类继承。

代表:策略模式

延伸出更具体的原则:封装变化

开放-封闭原则(OCP)

是说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。

代表:装饰者模式

依赖倒置原则(DIP)

依赖抽象,不要依赖具体类

听起来,与第三条很像,但是这里更强调"抽象"。这个原则说明了:不能让高层组件依赖底层组件,而且,两者都应该依赖于抽象。其实为了方便理解,可以将第三条并进来
A. 高层模块不应该依赖低层模块,两个都应该依赖抽象。
B. 抽象不应该依赖细节,细节应该依赖抽象。
依赖倒置原则(Dependence Inversion Principle,简称DIP)这个名字看着有点别扭,“依赖”还“倒置”,这到底是什么意思?依赖倒置原则的原始定义是: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. 高层模块不应该依赖低层模块,两者都应该依赖其抽象;
2. 抽象不应该依赖细节;
3. 细节应该依赖抽象。
高层模块和低层模块容易理解,每一个逻辑的实现都是由原子逻辑组成的,不可分割的原子逻辑就是低层模块,原子逻辑的再组装就是高层模块。
那什么是抽象,什么又是细节呢?在Java语言中,抽象就是指接口或抽象类,两者都是不能直接被实例化的;细节就是实现类,实现接口或继承抽象类而产生的类就是细节,其特点就是可以直接被实例化,也就是可以加上一个关键字new产生一个对象。
依赖倒置原则在Java语言中的表现就是:
1. 模块间的依赖是通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;
2. 接口或抽象类不依赖于实现类;
3. 实现类依赖接口或抽象类。
https://www.cnblogs.com/cbf4life/archive/2009/12/15/1624435.html

代表:工厂模式

延伸出更具体的原则:1. 针对接口编程,不针对实现编程 2.好莱坞原则

# 好莱坞原则

高层组件对待底层组件的方式是:别找我,我会找你                   

代表:模板方法模式

迪米特法则(LoD)

只和朋友交谈                    
又叫作最少知识原则(Least Knowledge Principle 简写LKP),
说法1:一个对象应当对其他对象有尽可能少的了解,不和陌生人说话,只和朋友交谈
说法2:果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。 

代表:外观模式 中介者模式

单一职责原则(SRP)

一个类应该只有一个改变的理由

代表:迭代器模式

里氏代换原则(LSP)

子类型必须能够替换掉它们的父类型。
肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑。其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的。

定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
定义2:所有引用基类的地方必须能透明地使用其子类的对象。

问题由来:有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P,其中P由原有功能P1与新功能P2组成。新功能P由类A的子类B来完成,则子类B在完成新功能P2的同时,有可能会导致原有功能P1发生故障。

解决方案:当使用继承时,遵循里氏替换原则。类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法。

继承包含这样一层含义:父类中凡是已经实现好的方法(相对于抽象方法而言),实际上是在设定一系列的规范和契约,虽然它不强制要求所有的子类必须遵从这些契约,但是如果子类对这些非抽象方法任意修改,就会对整个继承体系造成破坏。而里氏替换原则就是表达了这一层含义。

继承作为面向对象三大特性之一,在给程序设计带来巨大便利的同时,也带来了弊端。比如使用继承会给程序带来侵入性,程序的可移植性降低,增加了对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能会产生故障。

接口隔离原则(ISP)

概念:客户端不应该依赖他不需要的接口,类间的依赖关系应建立在最小的接口上。

接口隔离原则的核心定义,不出现臃肿的接口,但是“小”是有限度的,首先就是不能违反单一职责原则。

https://www.cnblogs.com/dolphin0520/p/3919839.html
https://blog.csdn.net/u011288271/article/details/52497602

你可能感兴趣的:(设计模式七大原则)