设计模式六大原则

175 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

设计模式的六大原则: Single Responsibility Principle:单一职责原则 Open Closed Principle:开闭原则 Liskov Substitution Principle:里氏替换原则 Law of Demeter:迪米特法则 Interface Segregation Principle:接口隔离原则 Dependence Inversion Principle:依赖倒置原则 把这 6 个原则的首字母(里氏替换原则和迪米特法则的首字母重复,只取一个)联合起来就是:SOLID(稳定的),其代表的含义也就是把这 6 个原则结合使用的好处:建立稳定、灵活、健壮的设计

单一职责原则 定义:一个类应该只有一个发生变化的原因。通俗的说,即一个类只负责一项职责。

    单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验。

开闭原则 定义:一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展,提高了复用性,以及可维护性。

开闭原则需要注意

    第一:抽象约束

    第二:元数据(metadata)控件模块行为 

    第三:制定项目章程 

    第四:封装变化 

里氏替换原则 定义:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。

通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。

它包含以下4层含义:

子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。 子类中可以增加自己特有的方法。 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。 迪米特法则 迪米特法则也叫最少知道法则:一个对象应该对其他对象有最少的了解。

强调以下两点:

从依赖者的角度来说,只依赖应该依赖的对象。

从被依赖者的角度说,只暴露应该暴露的方法

问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。

解决方案:尽量降低类与类之间的耦合。

接口隔离原则 定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

问题由来:

A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。

image.png

解决方案:

    将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。

image.png

依赖倒置原则 定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。说白了,就是“面向接口编程”。

    依赖倒置原则中的倒置指的是和一般OO设计的思考方式完全相反。别从上层模块开始思考,而是从下层模块开始,然后想想看能抽象化些什么。然后它们应该共享一个接口。

依赖倒置原则的作用

(1)依赖倒置原则可以降低类间的耦合性。

(2)依赖倒置原则可以提高系统的稳定性。

(3)依赖倒置原则可以减少并行开发引起的风险。

(4)依赖倒置原则可以提高代码的可读性和可维护性

依赖倒置原则的实现方法

依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性,所以我们在实际编程中只要遵循以下4点,就能在项目中满足这个规则。

(1)每个类尽量提供接口或抽象类,或者两者都具备。

(2)变量的声明类型尽量是接口或者是抽象类。

(3)任何类都不应该从具体类派生。

(4)使用继承时尽量遵循里氏替换原则

六大设计原则应用 理解:

    从整体上来理解六大设计原则,可以简要的概括为一句话,用抽象构建框架,用实现扩展细节,具体到每一条设计原则,则对应一条注意事项:

单一职责原则告诉我们实现类要职责单一; 里氏替换原则告诉我们不要破坏继承体系; 依赖倒置原则告诉我们要面向接口编程; 接口隔离原则告诉我们在设计接口的时候要精简单一; 迪米特法则告诉我们要降低耦合; 开闭原则是总纲,告诉我们要对扩展开放,对修改关闭。