设计模式之单一职责原则 Single Responsibility Principle 简称SRP
定义:应该有且仅有一个原因引起类的变更
用户管理类的接口:
(该接口设计存在问题,用户的属性和用户的行为没有分开,这是一个严重的错误。我们应该吧用户的信息抽取成一个BO(Bussiness Object,业务对象),把用户的信息抽取成一个Biz(Business Logic, 业务逻辑),如下图所示)
使用时,要获得用户信息的,就当是IUserBO的实现类,要是希望维护用户信息,就把它当成IUserBiz的实现类。
在实际使用中,我们更倾向于使用两个不同的类或接口:一个是IUserBO,一个是IUserBO,类图如下:
单一职责原则的应用:
电话通话时会有四个过程:拨号、通话、回应、挂机,那我们写一个接口,类图如下:
现在可以很容易的根据单一职责原则说它设计的有问题:这个接口拥有两个职责:一个是协议管理(dial()和hangup(),分别实现拨号和挂机),一个是数据传送(模拟信号的传递),那我们将其根据单一职责原则重新设计,又这两种职责的变化不互相影响,则:
单一职责原则的优点:
- 类的复杂性降低,实现什么职责都有明确的定义
- 代码的可读性提高
- 可维护性提高
- 变更引起的风险降低,变更时必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的拓展性、维护性都有极大的帮助。
单一职责不仅适用于接口、类,同时也适用于方法。即一个方法尽可能的做一个事情,像下面的这个方法就不可取:
正确做法是
对于单一职责原则,接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。