单一功能原则(Single responsibility principle)规定每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来。所有它的(这个类的)服务都应该严密的和该功能平行
我们这里定义了这样的一个接口,包括setName,setColor,eat和sleep方法,那么这里应该很明显,所有的事情都要交给Dog的实现类去完成,其中setName,setColor可以认为是完成了属性设置的任务,而后面的eat和sleep则完成了Dog的具体动作。从这里可以看出这个接口提供的方法存在职责不单一的问题,当然话说回来,setName,setColor如果放在一个接口中,那就职责单一了吗?一个设置名称,一个是设置颜色,也不是完全的单一嘛,我在这里的看法是不要斤斤计较,过分的划分功能,会导致设计的复杂化,加大工作量,所以在这里我觉得职责在划分的时候,需要进行一个抽象的过程,将完成的功能相近的划分到一起我觉得就可以了。
public interface Dog {
public void setName(String name); public void setColor(String color); public void eat(String food); public void sleep(); }public class DogImpl implements Dog {
public void setName(String name) { System.out.println("名字:"+name); }
public void setColor(String color) { System.out.println("颜色:"+color); }
public void eat(String food) { System.out.println("吃饭:"); }
public void sleep() { System.out.println("睡觉:"); }
}
public class TestDesign {
public static void main(String[] args) { Dog dog = new DogImpl(); dog.setColor("黑色"); dog.setName("贝贝"); dog.eat("骨头"); dog.sleep(); } }那么我们应该怎么设计这个接口让它满足单一职责呢?
参考了《设计模式之禅》中的例子,将不同职责的操作分开到不同的接口中去
/**
* Dog属性 */ public interface DogProperties { //默认名称 static final java.lang.String name="小黄"; //默认颜色 static final java.lang.String color="黄色"; String setName(String name); String setColor(String color); }/**
* Dog行为 */ public interface DogAction { //吃饭 public void eat(); //睡觉 public void sleep(); }/**
* * Dog的实际操作接口 * */ public interface DogOperation extends DogAction, DogProperties {}
/**
* * Dog的实现 * */ public class DogImp implements DogOperation {public void eat() { System.out.println("吃骨头"); }
@Override
public void sleep() { System.out.println("睡觉"); }@Override
public String setName(String name) { return name; }@Override
public String setColor(String color) { return color; }}
public class TestDesign {
public static void main(String[] args) { DogOperation dog = new DogImp(); String color = dog.setColor("白色"); String name = dog.setName("小白"); System.out.println(color); System.out.println(name); dog.sleep(); dog.eat(); } }这些代码比较简单,我这里就不再过多的说明了。
单一职责模式的优点
1. 降低了单个类的复杂性,尽量保证一个类中操作的类型一致
2. 可读性较好,因为单一职责的原因,对某种职责的操作可以去具体的类中查看。
单一职责原则,理论上我们要进行遵循的,但是往往实践中并不一定完全按照他的思路去设计,我的看法还是,尽量在完成业务需要的情况下,考虑按照单一职责原则对接口和类进行设计,类的设计过程中,不要过度的划分,适可而止就好。