编程爱好者联盟 2016-10-19
国际惯例,本文写于本人使用《大话设计模式》一书学习设计模式的路上,适用于初学设计模式的道友交流之用,大神误入,请留下您宝贵的意见,感激不尽;
《大话设计模式》这本书名字太长,此篇之后统一称呼《大设》;
定义
就一个类而言,应该仅有一个引起它变化的原因
理解
类级别的单一职责
我们都知道类是对事物的抽象,比如Person类就是对人的抽象,人拥有鼻子眼睛胳膊大腿等属性,拥有说话走路等行为,但是猴子也拥有同样的属性和行为,此时如果让你设计表示人的类和表示猴子的类,我想大多数会设计成两个类而不是一个类,当然如果你非要设计成一个类的话也可以,但是说不定哪天在你的程序里,人就退化成猴子了,前面所说是什么意思呢?就是在类级别上,一个类最好只表示一类事物,或者换句话说,一个类只完成一项功能,这句话怎么理解呢?就如同《大设》简单工厂模式中所提到的计算器程序一样,将加减乘除四个功能分别分成四个类,每个类都只完成一个功能,那么在需要修改其中一个功能时也只需要修改其中的一个类,当然,有人会说,我把四种运算写在一个类中,那我修改一个运算方法时也是只修改一个类,这样说也没有问题,但是这是后面所说的方法级别的单一职责,我们后面再说,此处所说的是类级别的单一职责,特指在一个类中只完成一项功能;
方法级别的单一职责
如上所提到的,在一个运算类中同时完成加减乘除四则运算,这个是违反类级别的单一职责的,因为在一个类中同时完成了多项功能,但是在一个类中的四则运算是分为四个方法来实现的,一个方法只完成了一个运算,这并不违背我们在重构中所说的一个方法只完成一个功能,这在方法级别来说并没有违反单一职责原则,虽然在类级别上违背了单一职责原则,但是缺点是什么呢?现在假如要完成一个比较复杂的计算器,需要加入乘方开放等等一系列的计算方法,那么在当前这个计算类中就需要不断的加入方法,当方法很多的时候,说不定你的一次修改就会把加法变成了减法,同时这也违反了我们后面要说的开闭原则;
使用
上面分别说了类级别和方法级别的单一职责原则,那么到底什么时候需要用到类级别的单一职责原则,什么时候需要用到方法级别的单一职责原则呢?
当类中的方法足够少的时候可以违背类级别的单一原则使用方法级别的单一原则;当类中的逻辑足够简单,才能违背类级别的单一原则;
虽然单一职责原则很简单,但是我们平常使用的时候却很少能做到单一职责原则,原因有很多种,比如客户着急要某个功能,只需要在原来的类上加上这个功能就能使用,但是这样是违反单一原则的,重构代码需要花费很多时间,这时候怎么办呢?我想大多数人都会选择第一种直接在原来的类上添加功能的写法,这也是不可避免的情况,我想说的是在能使用单一职责的情况下还是需要继续使用单一职责原则的,特殊情况特殊对待吧;
优点