1.单一职责原则是什么?
单一职责原则又被称为单一功能原则,是面向对象的六大基本原则之一,简单的说就是对一个类而言,应该有且只有一个变化的原因。一个类只有一个引起它变化的原因就是一个类只有一个职责。如果说一个类中的每个职责都是变化的一个轴线,如果这个类有一个以上的职责,这些职责就会耦合在一起,这样的设计是脆弱的,当其中的一个职责发生变化时就会有可能影响其它的职责。另外,多个职责耦合在一起还会影响其复用性。
2.代码中具体实现
有的时候在设计接口或者类的过程中会将对象的属性和行为放在同一接口中声明,这样就造成了业务对象和业务逻辑被放在同一类中,这样就造成了这个接口有两种属性和行为的两种职责,这种情况就是接口职责不明确违背了单一职责原则。
package SingleResponsibilityPrinciple;
public implements person
{
//身高属性
public void setHeight(double height);
public double getHeight();
//体重属性
public void setWeight(double weight);
public double getWeight();
//学习行为
public boolean programming(boolean study);
//娱乐行为
public boolean playing(boolean game);
}
上面的接口就存在这个问题,在接口中身高、体重属于业务对象,因此所对应的方法主要负责的是用户属性。而学习和娱乐属于业务逻辑,所对应的方法主要负责用户行为,如果按上面的方式实现就会给别人一个这个接口的职责不清楚的感觉,由于职责不清楚对后期的维护也会带来各种各样的问题。
这时可以遵循单一职责原则,将上面的接口改写为一个负责属性的接口和一个负责行为的接口即可。
PersonAttribute接口负责属性
package SingleResponsibilityPrinciple;
public implements PersonAttribute
{
//身高属性
public void setHeight(double height);
public double getHeight();
//体重属性
public void setWeight(double weight);
public double getWeight();
}
PersonBehavior接口负责行为
package SingleResponsibilityPrinciple;
public implements PersonBehavior
{
//学习行为
public boolean programming(boolean study);
//娱乐行为
public boolean playing(boolean game);
}
这样就实现了
接口的单一职责,那么在实现的过程中就要使用两个类分别去实现这两个接口
package SingleResponsibilityPrinciple;
public class Tom implements PersonAttribute
{
private double height;
private double weight;
public void setHeight(double height)
{
this.height = height;
}
public double getHeight()
{
return height;
}
public void setWeight(double weight)
{
this.weight = weight;
}
public double getWeight()
{
return weight;
}
}
package SingleResponsibilityPrinciple;
public class Allen implements PersonBehavior
{
public boolean programming(boolean study)
{
if(study)
{
System.out.println("该学习了,快去编程......");
return true;
}
else
{
return false;
}
}
public boolean playing(boolean game)
{
if(game)
{
System.out.println("该休息了,快去玩耍......");
return true;
}
else
{
return false;
}
}
}
通过这样改写以后每个接口的职责就清晰多了,当需求有变化时只要针对不同的职责去修改相对应的接口,同时只会影响到实现修改接口的那个类,而不会影响到其它的类,这样就降低了耦合性。
3.总结
在进行设计的过程中遵循单一职责原则带来的好处有:
- 降低类的复杂性,实现什么样的职责都有清晰的定义
- 降低需求变更带来的风险,增强程序的可扩展性
- 提高代码的可阅读性
- 提高代码的可维护性
但是,单一职责原则虽然有很多的好处,在我们使用的过程中也不能过度使用,因为“职责”是相对的概念并没有一个明确的划分,如果在程序设计的过程中把职责划分的太细的话就会导致接口和实现类的数量剧增,反而提高了复杂性、降低了代码的可阅读性和可维护性,所以在使用这个原则在划分职责的过程中还需要具体问题具体分析。
以上Demo的源代码地址:点击打开链接