最近在学习设计模式,学习设计模式的前提需要了解一下设计原则,在此结合《大话设计模式》做了整理
1.单一职责原则(SRP)
Single Responsibilities Principle
定义:
- 就一个类而言,应该仅有一个引起它变化的原因
- 软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。
小结:
- 可看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。责任过多,引起它变化的原因就越多,这样就会导致职责依赖,大大损伤其内聚性和耦合度。
例子
- 可以将所有代码堆积在一个类中,但应对需求变化时,都需要重新更改这份代码,代码变得不可能复用,代码维护性也变得很差劲。
2.开放关闭原则(OCP)
Open-Closed Principle
关键步骤:
- 抽象化
定义:
- 软件实体(类,方法等等)应该可以扩展(扩展可以理解为增加),但是不能在原来的方法或者类上修改,也可以这样说,对增加代码开放,对修改代码关闭。
- 开放封闭原则(OCP)是面向对象设计的核心思想。
优点:
- 可维护(维护成本小,做管理简单,影响最小)
- 可扩展(有新需求,增加就好)
- 可复用(不耦合,可以使用以前代码)
- 灵活性好(维护方便、简单)。
小结:
- 开发人员应该仅对程序中出现频繁变化的那些部分做出抽象,但是不能过激,对应用程序中的每个部分都刻意地进行抽象同样也不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。
3.里氏代替原则(LSP)
Liskov Substitution Principle
定义:
- 子类型必须能够替换掉它们的父类型
- 实现面向接口编程的基础。
小结:
- 基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
- 里氏代替原则使开放封闭原则成为了可能(有于子类型的可替换性才使得父元素类型的模块在无需修改的情况下就可以扩展)
4.依赖倒置原则(DIP)
Dependence Inversion Principle
定义:
- 抽象不应该依赖细节,细节应该依赖于抽象
- 针对接口编程,而不要针对实现编程。
小结:
- 是面向对象设计的标志,如果编码时考虑的是面向接口编程,而不是简单的功能实现,体现了抽象的稳定性,只有这样才符合面向对象的设计。
5. 接口隔离原则(ISP)
Interface Segregation Principle
定义:
- 使用多个专门的接口比使用单一的总接口要好。
- 不要让一个单一的接口承担过多的职责,而应把每个职责分离到多个专门的接口中,进行接口分离。
- 过于臃肿的接口是对接口的一种污染。
小结:
- 在做接口设计的时候,要尽量设计的接口功能单一,功能单一,使它变化的因素就少,这样就更稳定,这体现了高内聚,低耦合的原则,避免接口的污染。
6.组合复用原则(CRP)
Composite Reuse Principle
定义:
- 在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分。
- 尽量使用合成/聚合,尽量不要使用继承。
小结:
*组合/聚合复用原则可以使系统更加灵活,类与类之间的耦合度降低,一个类的变化对其他类造成的影响相对较少。
7.迪米特法则(最少知识原则)
Law of Demeter(Least Knowledge Principle)
定义:
- 一个对象应当对其他对象有尽可能少的了解。
- 一个模块或对象应尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立,这样当一个模块修改时,影响的模块就会越少,扩展起来更加容易。
- 只与你直接的朋友们通信;不要跟“陌生人”说话。
补充:
- 外观模式(Facade Pattern)和中介者模式(Mediator Pattern)就使用了迪米特法则。