一个优良的系统设计,强调模块间保持低耦合、高内聚的关系,在面向对象设计中这条规则同样适用,所以面向对象的第一个设计原则就是:单一职责原则(SRP,Single Responsibility Principle)。
单一职责,强调的是职责的分离,在某种程度上对职责的理解,构成了不同类之间耦合关系的设计关键,因此单一职责原则或多或少成为设计过程中一个必须考虑的基础性原则。
关于单一职责原则,其核心的思想是:一个类,最好只做一件事,只有一个引起它变化的原因。
单一职责原则可以看作是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原因就越多,这将导致职责依赖,相互之间就产生影响,从而极大的损伤其内聚性和耦合度。单一职责,通常意味着单一的功能,因此不要为类实现过多的功能点,以保证实体只有一个引起它变化的原因。 看下面例子:
public interface Program {
//绘制图形
void draw();
//计算面积
void area();
}
public class DrawGraph implements Program{
@Override
public void draw() {
System.out.println("绘制图形");
}
@Override
public void area() {
// TODO Auto-generated method stub
}
}
public class AreaCount implements Program {
@Override
public void draw() {
// TODO Auto-generated method stub
}
@Override
public void area() {
System.out.println("计算面积");
}
}
以上图形计算程序只使用了正方形的Area()方法,永远不会使用Draw()方法,而它却跟Draw方法关联了起来。这违反了单一原则,如果未来因为图形绘制程序导致Draw()方法产生了变化,那么就会影响到本来毫不关系的图形计算程序。
应该把接口改成2个,将不同的职责分配给不同的类,使单个类的职责尽量单一,就隔离了变化,这样他们也不会互相影响了。
public interface Draw {
//绘制图形
void draw();
}
public interface Area {
//计算面积
void area();
}
然后分别实现接口,如下: