设计模式-六大原则

/ 默认分类 / 0 条评论 / 1050浏览

下一篇预告----设计模式-23种设计模式类图


什么是设计模式

什么事设计模式呢?通俗来讲就是在处理问题的过程中总结出来的问题的解决方案。

设计模式六大原则

说起设计模式的六大原则,能对刚接触到设计模式的同学来说,就会一脸迷茫,什么是设计模式的六大原则呢? 下面就给大家一一介绍:

下面就每一个原则给大家做下介绍:

单一职责原则

单一职责原则(Single Responsibility Principle,简称SRP),对于SPR的解释,原话是这样的:

There should never be more than one reason for a class to change。

翻译过来大概意思就是,应该有且只有一个原因引起类的变更。他要求 单一职责有什么好处:

单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类设计的是否优良,但是“职责”和“变化原因”都是不可度量的, 因项目而异,因环境而异。

里氏替换原则

里氏替换原则(Liskov Substitution Principle,简称LSP),它有两种定义:

只要父类出现的地方子类就可以出现,而且替换为子类也不会产生错误或异常,使用者可能根本就不需要知道是父类还是子类。但是反过来就不行了,有子类出现的地方,父类未必能适应。

说到里氏替换就不得不提一下继承,在面向对象语言里,继承是非常优秀的语言机制,它有如下优点:

同时,继承也有其缺点:

为了解决弊端带来的影响,我们引入了里氏替换原则。里氏替换原则为良好的继承定义了一个规范,主要包括4层含义:

  1. 子类必须完全实现父类的方法。子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。
  2. 子类可以有自己的个性。里氏替换原则可以正着用,但是不能反过来用,在子类出现的地方,父类未必可以胜任。
  3. 覆盖或实现父 类的方法是输入参数可以被放大。
  4. 覆盖或实现父类的方法是输出结果可以被缩小。

依赖倒置原则

依赖倒置原则(Dependence inversion Principle,简称DIP),原始定义为:High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.翻译过来包括三层含义:

其中,什么是抽象?什么又是细节呢?在java语言中,抽象就是指抽象类或接口,两者都不能被实例化;细节就是指实现类,实现接口或继承抽象类而产生的类就是细节,其特点就是可以被实例化。依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合。 依赖的三种写法:

接口隔离原则

在说接口隔离之前,我们先说下接口,接口分为两种:

什么是接口隔离呢?我们看下它的定义:

接口隔离原则及时对接口的定义,同时也是对垒的定义,接口和类尽量使用原子接口或原子类来组装。

迪米特法则

迪米特法则(Law of Demeter,LOD),也被称为最少知识原则(Least Knowledge Principle,LKP):一个对象应该对其他对象有最少的了解。

通俗来讲,一个类应该对自己需要耦合或调用的类知道的最少,其他的不必关心。迪米特法则的核心观念就是类解耦,弱耦合,只有弱耦合了以后,代码的复用率才可以提高。解耦之后带来的中转类或跳转类的增加会导致系统的复杂性提高,同时也增加了维护的难度。所以使用迪米特法则的时候要反复权衡,做到,既能让结构清晰,又能做到高内聚低耦合。

开闭原则

开闭原则的定义: Software entities like classes,modules and functions should be open for extension but closed for modifications.(一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。)

开闭原则对扩展开放,对修改关闭,并不意味着不做任何修改,底层模块的变更,必然要有高层次模块进行耦合,否则就是一个孤立无意义的代码片段。