设计模式的七大原则
前言
一直感觉设计模式非常的高大上,正好现在有空闲时间,准备学习学习设计模式相关的知识。该篇文章主要是关于七大设计模式原则。
正文
设计模式的七大原则有:
开闭原则
里氏替换原则
依赖倒置原则
单一职责原则
接口隔离原则
迪米特法则(最少知道原则)
合成复用原则
下面是对各个原则的详细解释:
1、开闭原则:
(1)基本介绍:
①开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则。
②一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。
③当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
(2)作用:
①对软件测试的影响,即软件遵守开闭原则的话,软件测试时只需要对扩展的代码进行测试就可以了,因为原有的测试代码仍然能够正常运行。
②可以提高代码的可复用性,即粒度越小,被复用的可能性就越大;在面向对象的程序设计中,根据原子和抽象编程可以提高代码的可复用性。
③可以提高软件的可维护性,即遵守开闭原则的软件,其稳定性高和延续性强,从而易于扩展和维护。
(3)实现方法:
可以通过“抽象约束、封装变化”来实现开闭原则,即通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。
2、里氏替换原则:
(1)基本介绍:
①如果对每个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。换句话说,所有引用基类的地方必须能透明地使用其子类的对象。
②子类可以扩展父类的功能,但是不能修改父类原有的功能。
③在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法。
④里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可以通过聚合,组合,依赖来解决问题。
(2)作用:
①里氏替换原则是实现开闭原则的重要方式之一。
②它克服了继承中重写父类造成的可复用性变差的缺点。
③它是动作正确性的保证。即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。
(3)实现方法:
子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
3、依赖倒置原则:
(1)基本介绍:
①高层模块不应该依赖低层模块,二者都应该依赖其抽象。
②抽象不应该依赖细节,细节应该依赖抽象。
③依赖倒转(倒置)的中心思想是面向接口编程
(2)作用:
①可以降低类间的耦合性。
②可以提高系统的稳定性。
③可以提高代码的可读性和可维护性。
(3)实现方法:
①每个类尽量提供接口或抽象类,或者两者都具备。
②变量的声明类型尽量是接口或者是抽象类。
③任何类都不应该从具体类派生。
④使用继承时尽量遵循里氏替换原则。
4、单一职责原则:
(1)基本介绍:
一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分。
(2)作用:
①降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。
②提高类的可读性。复杂性降低,自然其可读性会提高。
③提高系统的可维护性。可读性提高,那自然更容易维护了。
④变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。
(3)实现方法:
发现出类的不同职责并将其分离,再封装到不同的类或模块中。
5、接口隔离原则:
(1)基本介绍:
要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
(2)作用:
①将臃肿庞大的接口分解为多个粒度小的接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
②接口隔离提高了系统的内聚性,减少了对外交互,降低了系统的耦合性。
③使用多个专门的接口还能够体现对象的层次,因为可以通过接口的继承,实现对总接口的定义。
(3)实现方法:
①接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。
②为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。
③提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
6、迪米特法则(最少知道原则):
(1)基本介绍:
①一个对象应该对其他对象保持最少的了解。
②类与类关系越密切,耦合度越大。
③迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多少复杂,都尽量将逻辑封装在类的内部。对外除了提供的public 方法,不对外泄露任何信息
④只与你的直接朋友交谈,朋友类的定义是这样的:出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类。
(2)作用:
①降低了类之间的耦合度,提高了模块的相对独立性。
②由于亲合度降低,从而提高了类的可复用率和系统的扩展性。
(3)实现方法:
①在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标。
②在类的结构设计上,尽量降低类成员的访问权限。
7、合成复用原则:
(1)基本介绍:
在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现(如果要使用继承关系,则必须严格遵循里氏替换原则)。
(2)作用:
①维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
②新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。
③复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。
(3)实现方式:
通过将已有的对象纳入新对象中,作为新对象的成员对象来实现的,新对象可以调用已有对象的功能,从而达到复用。

浙公网安备 33010602011771号