应该有且仅有一个原因引起类的变更.
There should never be more than one reason for a class to change。
单一职责适用于接口,类,甚至是方法.
但对于类来说,往往又很难说.
因为受限于实际情况的多种因素影响,往往并不能保证类的单一职责.
接口的单一职责举例:
一个电话接口,定义电话的功能
dial拨号,chat通话,answer回应,hangeup挂断.
从特别的角度看,这个接口包含两种职责,一个是协议管理,即拨号与挂断,一个是数据传输,通话与回应.
可以修改为下图
但这种方式又增加了类的耦合度,phone类需要由ConnectionManager和DataTransfer组合而成.
而上图这种方式,一个类实现两种接口则是我们通常采用的方式.
此种方式明显更加完美,实现了接口职责的分割,又避免了组合类增加的耦合度.
方法的单一职责举例:
这个方法根据type的不同,将可变参数changeOptions的值修改到userBO上.
看着好像挺方便,一个方法解决了很多问题,但此方法职责不清晰,不单一.需要大量的配套说明来解释.
而下图的的方法设计则简单明了,职责清晰,利于别人使用,并且也使维护的成本降低.