设计模式-面向对象设计原则(UML类图解释)

1.单一职责原则

一个类只负责一个功能领域中的相应职责。或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。
核心思想:一个类不能太“累”!
原则:高内聚、低耦合的指导方针。

  • 例子:CustomerDataChart类的方法说明如下:getConnection方法用于连接数据库;findCustomer方法用于查询所有客户信息;createChart方法用于创建图表;displayChart方法用于显示图表。
    在这里插入图片描述
    现使用单一职责原则对其重构。
    在这里插入图片描述

(1)DBUtil:负责连接数据库;
(2)CustomerDAO:负责操作数据库中的Customer表;
(3)CustomerDataChart:负责图表的生成和显示。

2.开闭原则

一个软件实体应当对扩展开放,对修改关闭。即软件实体应在不修改原有代码的情况下进行扩展。

3.里氏代换原则

所有引用基类(父类)的地方必须能透明地使用其子类的对象。
原则:在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立。

4.依赖倒转原则

抽象不应该依赖于细节,细节应该依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
原则:在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体的类来做这些事情。

  • 例子:开发人员在开发某CRM时发现该系统经常需要将存储在TXT和Excel文件中的客户信息转存到数据库中,因此要进行数据格式的转换。在客户操作类中将调用数据格式转换类的方法实现格式转化和数据库插入操作。初始设计如下图所示:
    在这里插入图片描述
    在实际运行时,这个方案在每次转换数据时更换不同的数据转换类,非常不方便。根据依赖倒转原则重构后的方案如下:
    在这里插入图片描述
    引入抽象数据转换类DataConvetor后,符合依赖倒转原则。程序运行时,具体数据转换类将替换成DataConvetor类型对象(里氏替换原则),程序不会有任何的异常。如果要新增数据转换类,只需要将新类作为DataConvertor类的子类即可。

5.接口隔离原则

使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
原则:当一个接口太大时,需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。

  • 例子:某CRM系统的客户数据显示模块设计如图所示:方法readData用于从文件中读取数据;方法transformToXML用于将数据转换成XML格式;方法createChart用于创建图表;方法displayChart用于显示图表;方法createReport用于创建文字报表;方法displayReport用于显示文字报表。
    在这里插入图片描述
    现用接口隔离原则对其进行重构。
    在这里插入图片描述
    在使用接口隔离原则的时候,需要注意控制接口的粒度。接口不能太小,如果太小会导致系统中的接口泛滥,不利于维护;接口也不能太大,太大将违背接口隔离原则。

6.合成复用原则

尽量使用对象组合,而不是继承来达到复用的目的。
原则:在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之称为新对象的一部分;新对象通过委派调用已有对象的方法来达到复用的目的。简言之:复用时尽量使用组合/聚合关系(关联关系),少用继承。

  • 例子:在初期CRM系统设计中,考虑客户数量不多,系统采用MySQL作为数据。
    在这里插入图片描述
    随着客户数量的增加,系统决定升级为Oracle数据库。因此就需要增加一个OracleDBUtil来连接Oracle数据库。在原始设计中CustomerDAO类DBUtil类之间是继承关系,因此在更换数据库时需要更改源代码,违反了开闭原则。
    根据合成复用原则重构方案:
    在这里插入图片描述
    将CustomerDAO与DBUtil之间的关系由继承关系变为关联关系,采用依赖注入的方式将DBUtil对象注入CustomerDAO中,可以使用构造注入,也可以使用设值注入。OracleDBUtil类扩展了DBUtil类的功能,只需要在CustomerDAO中注入子类对象,即OracleDBUtil对象,就可以实现Oracle连接。

7.迪米特法则

一个软件实体应当尽可能减少地与实体发生相互作用。

  • 例子:
    在这里插入图片描述
    迪米特法则重构后:
    在这里插入图片描述
    用中间类来协调Button对其它部件的使用。
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值