面向对象七个原则

2018-02-13  本文已影响0人  CrixalisAs

一、开闭原则

1. 定义:

一个软件实体应当对扩展开放,对修改关闭。在设计一个模块时,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改代码的情况下改变这个模块的行为。

2. 分析:

3. 实例:

客户端提供加法按钮,用户可能会改变需求要求使用其他运算功能,原始设计方案如图所示: 图1

现对该系统进行重构,使之满足开闭原则的要求:


图2

对比分析:

二、依赖倒转原则

1. 定义:

2. 分析:

3. 实例:

某系统提供一个数据转换模块,可以将来自不同数据源的数据转换成多种格式,如可以转换来自数据库的数据、也可以转换来自文本的数据,转换后的格式可以是XML文件、也可以是XLS文件


图1
图2

对比分析:

图1为什么要到图2?因为该系统可能需要增加新的数据源或者新的文件格式,每增加一个新的类型的数据源或者新的类型的文件格式,客户类MainClass都需要修改源代码,以便使用新的类,但违背了开闭原则。现使用依赖倒转原则对其进行重构。

总结:高层模块不应该依赖底层模块,两个都应该依赖与抽象;抽象不应该依赖于细节,细节应该依赖于抽象。

三、里氏代换原则

1. 定义

2. 分析

3. 实例

对比分析:

图1为什么到图2?因为如果需要更换一个加密算法类或者增加并使用一个新的加密算法类,如将CipherA改为CipherB,则需要修改客户类Client和数据操作类DataOperator的源代码,违背了开闭原则。现使用里氏代换原则对其进行重构,使得系统可以灵活扩展,符合开闭原则。
总结:子类型必须能够替换掉它们的父类型。

四、单一职责原则

1. 定义

2. 分析

3. 实例

某基于Java的C/S系统的“登录功能”通过如下登录类(Login)实现:


图1
图2

对比分析:

图1功能太过于集成,严重违反类的单一原则。
总结:就一个类而言,应该仅有一个引起它变化的原因。

五、接口隔离原则

1. 定义

2.分析

3.实例

对比分析:

图1为什么到图2?因为这样做既满足了接口隔离原则,又满足了单一原则,何乐而不为呢,但是也带来了很多的不便,类增多了。
总结:类应该完全依赖相应的专门的接口

六、合成复用原则

1.定义

2.分析

3. 实例

对比分析:

图1为什么到图2?因为如果需要更换数据库连接方式,如原来采用JDBC连接数据库,现在采用数据库连接池连接,则需要修改DBUtil类源代码。如果StudentDAO采用JDBC连接,但是TeacherDAO采用连接池连接,则需要增加一个新的DBUtil类,并修改StudentDAO或TeacherDAO的源代码,使之继承新的数据库连接类,这将违背开闭原则,系统扩展性较差。
总结:类中应用,尽量使用对象组合而不是用继承来达到复用的目的。

七、迪米特法则

1. 定义

2. 分析

  1. 在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及
  2. 在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限
  3. 在类的设计上,只要有可能,一个类型应当设计成不变类
  4. 在对其他类的引用上,一个对象对其他对象的引用应当降到最低。

3. 实例

对比分析:

图1为什么到图2?因为这样就可以降低类的耦合性,是类中功能更加单一,相当于外观模式。
总结:一个软件实体应当尽可能少的与其他实体发生相互作用

上一篇 下一篇

猜你喜欢

热点阅读