设计模式(三)设计原则

284 阅读3分钟

设计模式里面一共有六种设计原则,分别是SOLID 原则 和 迪米特原则。

单一职责原则 (SRP)

定义:every module or class should have responsibility over a single part of the functionality provided by the software, and that responsibility should be entirely encapsulated by the class, module or function.翻译每个模块或类都应对软件提供的功能的单个部分负责,并且该责任应完全由类,模块或功能封装。简单说就是一个类或者模块只负责一个职责。

举个不太恰当的例子。

每年的双十一,我们剁手我们肯定都是希望买到的东西足够便宜,以前的优惠卷是直接给你便宜多少,功能单一,职责明确。

但是现在的双十一规则太复杂了。对普通人需要拉人组队,定金膨胀,红包,满送等。这个写规则就是功能不够单一,消费者根本搞不清楚里面的玩法。这是一个反例。

判断是否满足单一原则有个方法,就是是不是有两个或者两个以上的动机修改一个类,如果是,那这个类就有两个职责。

单一原则是让我们避免设计大而全的类,但是我们也要看代码的实际情况,不要拆分太细,影响代码可维护性。

开放-封闭原则(OCP)

定义:software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification。翻译过来就是,软件实体(类,模块,函数等)应该对扩展开放,对修改关闭。

当我们遵循开放封闭原则的时候,我们总是用最小的改动开实现我们的需求,通过扩展,而不是修改原有代码。这也要求我们开始的时候就设计好。具备扩展意识,封装意识。

里式替换原则 (LSP)

定义:子类对象能够替换父类对象,并且保证程序运行正常。

这个原则是用来指导在继承中,子类如何很好的按照父类的约定,来设计。以此来达到替代父类的作用,还有可能增强。

接口隔离原则 (ISP)

定义: Clients should not be forced to depend upon interfaces that they do not use。客户端不应该被强迫依赖它不需要的接口。其中的“客户端”,可以理解为接口的调用者或者使用者。

这个设计原则跟单一原则有点像,都是不希望有额外的冗余。希望我们能拆分更细一点。单一职责面向是是类,函数,对象,而接口隔离原则面对是是接口。

依赖反转原则(DIP)

定义:高层模块(high-level modules)不要依赖低层模块(low-level)。高层模块和低层模块应该通过抽象(abstractions)来互相依赖。

打个比方,我们充电的手机是高层模块,充电器是低层模块。如果手机依赖的是具体的充电线的话,iPhone 6 和 iphone 7 的充电线都不一样,这就非常麻烦,假设我们是 iPhone6,出门忘记带充电线了。朋友用的 iPhone 7, 这种情况就非常尴尬。

真实的 iPhone 都是依赖一个抽象的Lightning的来充电,并不是每一个手机型号依赖一个充电器。

迪米特原则 (LOD)

定义:不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口(也就是定义中的“有限知识”)。

不该有依赖的,没有依赖,这是松耦合,有依赖关系的类之间,尽量只依赖必要的接口这是高内聚。

参考资料

极客时间《设计模式之美》