设计模式笔记(一)设计六大原则之一--单一职责原则

单一职责原则 Single Responsibility Principle,简称RSP

定义:

应该有且仅有一个原因引起类的变更。

举例:用户信息接口

拆分前
Interface UserInfo
Void setUserId(String userId)
String getUserId()
Void setPassword(String password)
String getPassword()
Void setUserName(String userName)
String getUserName()
Boolean changePassword(String okPassword)
Boolean deletePassword()
Void mapUser()
Boolean addOrg(int orgId)
Boolean addRole(int roleId)

拆分后
Interface UserBo
Void setUserId(String userId)
String getUserId()
Void setPassword(String password)
String getPassword()
Void setUserName(String userName)
String getUserName()

Interface UserBiz

Boolean changePassword(String okPassword)
Boolean deletePassword()
Void mapUser()
Boolean addOrg(int orgId)
Boolean addRole(int roleId)
以上我们把一个接口拆分成两个接口的动作,就是依赖了单一职责的原则。
UserBo的职责就是收集和反馈用户的属性信息;UserBiz负责用户的行为,完成用户信息的维护和变更。

单一原则是否一定要遵循:并不是

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

举例:一个电话过程

Interface IPhone
Void dial(String phoneNumber)
Void chat(Object o )
Void hangup()

Public interface IPhone{
//拨通电话
Public void dial(String phoneNumber);
//通话
Public void chat(Object o);
//通话完毕,挂电话
Public void hangup();
}
先看这个接口有没有问题?我们平常大多数都是这么写的,肯定觉得没问题。但是用单一职责原则来想,IPhone这个接口不止有一个原则:一个是协议管理,一个是数据传送。Dail()和hanup()两个方法实现了协议管理,分别负责拨号接通和挂机;chat()实现的是数据传送、把我们说的话换成模拟信号或数字信号传递给对方,然后再把对方传递过来的信号还原成我们听得懂的语言。通过分析,协议管理会引起这个接口的变化,传送管理也会引起这个接口或实现的变化,而且两个职责互相不影响,就可以考虑拆分成两个接口了。

Interface IConnectionManager
Void dial(String phoneNumber)
Void hangup()

Interface IDataTransfer
DataTransfer(IConnectionManager cm)

单一职责原则的好处:

上面的电话例子可看出
1. 类的复杂性降低,实现什么职责都有清晰明确的定义
2. 可读性提高
3. 可维护性提高
4. 变更引起的风险降低,变更时必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他接口无影响,对系统的扩展性,维护性都有非常大的帮助
但是IPhone这个接口一定就是不可以的吗?并不是,项目中要考虑很多因素,设计简单,例如一个接口一个实现类,因此设计一个IPhone接口也可能是没有错的。如果单纯从理论上分析就有问题:有两个可以变化的原因放到了一个接口中,为以后的变化带来了风险。例如,如果以后模拟电话升级到数字电话,我们提供的IPhone接口是不是就要修改了?接口修改对其他的Invoker类是不是有很大影响?

总结:

接口:

设计得时候一定要做到单一

实现类

多方面考虑。可能会引起类的剧增和系统的复杂性提高。

方法

一个方法尽可能只做一件事情。
例如,修改密码的功能
正确写法:
Void changePassword(String okPassword)
错误写法:(所有的用户信息修改都在一个方法里面)
Void changeUser(UserBo userBo,String… changeOptions)
下面的错误写法也叫做粗颗粒的方法,我们做到尽可能细。
即:接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值