以下内容来自《Java设计模式》
1 单一职责原则
单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小。单一职责原则的定义如下:
单一职责原则:
一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。
单一职责原则的另一种定义方式:就一个类而言,应该仅有一个引起它变化的原因。
在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性越小,而且一个类承担的责任过多,相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其它职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同变化原因封装在不同的类中,如果多个职责总是同时发生改变,则可将他们封装在同一个类中。
单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验。
下面通过一个简单实例来进一步分析单一职责原则。
2 单一职责原则实例
某软件公司开发人员针对客户关系管理系统中的客户信息图形统计模块提出了如图2-1所示的初始设计方案。在CustomerDataChart类的方法中,getConnection()方法用于连接数据库,findCustomers()用于查询所有的客户信息,createChart()用于创建图表,displayChart()用于显示图表。
现在使用单一原则对其进行重构。
在图2-1中,CustomerDataChart类承担了太多的职责,既包含与数据库相关的方法,又包含与图表生成和显示相关的方法。如果在其他类中也需要连接数据库或者使用findCustomer()方法查询客户信息,则难以实现代码的重用。无论是修改数据库连接方式还是修改图表显示方式都需要修改该类,它拥有不止一个引起它变化的原因,违背了单一职责原则。因此需要对该类进行拆分,使其满足单一职责原则,CustomerDataChart类可拆分为以下3个类。
-
DBUtil:
负责连接数据库,包含数据库连接方法getConnection(); -
CustomerDAO:
负责操作数据库中的Customer表,包含对Customer表的增、删、改、查等方法,例如findCustomers() -
CustomerDataChart:
负责图表的生成和显示,包含createChart()和displayChart()方法。
使用单一职责原则重构后的结构图如图2-2所示:
3 设计模式的七大原则
【设计模式】单一职责原则
【设计模式】开闭原则
【设计模式】里氏替换原则
【设计模式】依赖倒转原则
【设计模式】接口隔离原则
【设计模式】合成复用原则
【设计模式】迪米特法则