设计模式七大原则

引言

设计模式如单例模式、工厂模式、适配器模式等,大概有二十多种,但是这些设计模式的背后,有七大设计基本原则。

它们分别是:单一职责原则,接口隔离原则,依赖倒转原则,里氏替换原则,开闭原则(OCP),迪米特法则,合成复用原则。

这些设计模式的基础设计原则,虽然都非常简单,但是却指导着软件开发的方方面面。这篇文章对各个原则做以简单总结。

一、单一职责原则

单一职责原则(SRP:Single responsibility principle)又称单一功能原则,它规定一个类应该只有一个发生变化的原因。应该只有一个职责。

每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起。耦合会影响复用性。

所以要遵守单一职责原则,避免将不同职责的功能或接口写到同一个类中,增加了耦合性。

二、接口隔离原则

接口隔离原则指的是,客户程序不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。使用多个专门的接口比使用单一的总接口要好。

三、依赖倒转原则

依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。

简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

其核心思想是面向接口编程。因为相对于细节的多边形,抽象的东西要稳定的多,以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。

使用抽象的目的是制定规范,不涉及任何具体的操作,把展示细节的任务交给实现去完成。

三种依赖关系传递的方式:

1、接口传递,即直接在接口方法的参数中传递,这里的接口并不是指 interface,而是指方法。因为方法可以被客户端调用,所以相对于客户端来说,这个被调用的方法就是一种广义的接口。

2、构造方法传递

3、set方法传递

四、里氏替换原则

OO中的继承性包含这样的一层含义,父类中凡是已经实现好的方法,实际上是在设定规范和契约。虽然它不强制要求所有的子类必须遵循这契约(可以重写),但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏。

继承在给程序设计带来便利的同时,也带来了弊端。比如使用继承会给程序带来侵入性,程序的可移植性降低,增加了对象间的耦合性。如果一个类被其他类继承,当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到的子类功能都可能出现问题。

因此我们需要遵循里氏替换原则,来设计我们的继承关系。

里氏替换原则(Liskov Substitution Principle LSP)是指,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

如果对每个类型为T1的对象o1,都有类型T2的对象o2,使得以T1定义的所有程序在所有的对象o1都替换成o2时,程序的行为没有发生变化。换句话说,所有引用父类的地方必须能透明地使用其子类的对象。

在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类已经实现了的方法。

里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可以通过聚合、组合、依赖来解决问题。

五、开闭原则

开闭原则规定:软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的。这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。

当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。

编程中遵循其他原则,以及使用设计模式的目的就是遵循开闭原则。

六、迪米特法则

迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话

在迪米特法则中,朋友指的是方法参数成员变量方法返回值所属的类,而像局部变量这种只在过程中使用的类就是陌生的。

迪米特法则的核心是降低类之间的耦合。注意,迪米特法则是为了减少类与类之间的不必要的依赖,降低类的耦合关系,并不是要求完全没有依赖关系。

七、合成复用原则

合成复用的原则是尽量使用组合或聚合的方式实现类与类的依赖,而不是继承。

总结

1、找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

2、针对接口编程,而不是针对实现编程。用抽象制定规则,实现填充细节,实现填充变化。

3、努力降低交互对象之间的耦合性,提高内聚性。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页