单一职责原则(Single Responsibility Principle,SRP)
There should never be more than one reason for a class to change.
应当有且仅有一个原因能导致类的改变。
单一职责原则要求我们在设计类与接口时要尽可能让其简单化。这么做的原因是往往一个承担了多种职责的类会比承担了一种职责的类的修改可能性大许多。
单一职责原则带来的好处是能让代码的可读性、可维护性提高,系统的耦合性降低。每个类面向的是某项具体的工作职责,这使代码的可理解程度上升,而一旦程序容易理解,并且抽象化程度较高的话会十分有利于后期维护。
单一职责原则并不是提倡你的类仅有一个方法,很多人刚学习这个原则时都会有这个误区。我们抠住职责这个字眼,至于职责的划分有很多种方式。就比如一条狗,它可以叫,可以走,那么这便是它的职责。一个登陆处理,它可能有登入和登出,这就是它的单一职责,而不应该把其他的业务耦合到这个登录处理类中去。
我们看一下下面的例子:
例子1
就比如上面的这个接口,狗的职责就是狗吠和行走,而至于它属于谁,这本身并不是Dog类所拥有的行为,完全是受外界环境影响的,不稳定的。不符合单一职责的。
例子2
如例子2,就好比我们加工一样东西,肯定会经过加材料->操作->取出成品这三个步骤,不同的东西加工差异的地方体现在操作上,那把操作抽象后给扩展类自定义,就满足了只有一个原因会导致类改变的原则。
结果如下:
假如此时有个新的B模板,那就直接继承模板重写抽象operation()方法就可以扩展了。
从这里我们可以联想到J2EE的servlet,filter,listener都是将处理的方法抽象后给用户自定义。使之满足只有一个原因导致类改变的原则。
单一职责原则倡导的是将类进行细分,细分到只有一个原因才能导致类的变化。而对应这个原因的地方,我们可以对其进行抽象化,使之具有高度的扩展性。
以上是我对于单一职责的理解,有不对的地方请朋友留言帮我指正一下。