单一职责原则定义
单一职责原则的英文名称是Single Responsibility Principle,简称SRP。SRP的原话解释是:There should never be more than one reason for a class to change.
也就是说一个类,只有一个引起它变化的原因,应该只有一个职责。每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起。
这会导致脆弱的设计。当一个职责发生变化时,可能会影响其它的职责。另外,多个职责耦合在一起,会影响复用性。例如:要实现逻辑和界面的分离。
单一职责的好处:
- 类的复杂性降低,实现什么职责都有清晰明确的定义;
- 可读性提高,复杂度降低,可读性提高;
- 可维护性提高,可读性提高,维护更容易;
- 适应变更的能力更强,自然风险就降低了;
应用案例说明
很多人去国外出差,需要去银行兑换美元、欧元等货币,不同种类的货币对应的汇率不一样,汇率也会有波动。我们设计一个类Exchange如下:
package example;
/**
* @version V1.0
* @description:
* @author: yuqingit
* @date: 2020/9/22 9:33
*/
public class Exchange {
/**美元*/
public static final String DOLLAR = "Dollar";
/**欧元*/
public static final String EURO = "Euro";
/**
* 获取不用币种的汇率
* @param type
* @return
*/
public double getExchangeRate(String type){
switch (type)
{
case DOLLAR:
return 0.147;
case EURO:
return 0.1249;
default:
return 1;
}
}
/**
* 兑换
* @param money
* @param type
* @return
*/
public double exchangeMoney(double money,String type){
return money*getExchangeRate(type);
}
public static void main(String[] args) {
Exchange exchange = new Exchange();
System.out.println(exchange.exchangeMoney(100,"Euro"));
}
}
初看上面代码没有什么问题,会有同学也会这么设计。但仔细思考后,如果此类发生变化,比如汇率发生变化、增加其它货币的兑换等都需要调整Exchange类。单一职责规定,只有一个变化的原因引起类的改变,这样就违背了单一职责原则了。我们需要重新设计如下:
package example;
/**
* 货币接口,获取汇率方法
* @version V1.0
* @description:
* @author: yuqing
* @date: 2020/9/22 9:56
*/
public interface Currency {
/**
* 每种货币实现此方法,汇率不一样
* @return
*/
double getExchangeRate();
}
package example;
/**
* @version V1.0
* @description:
* @author: yuqing
* @date: 2020/9/22 10:01
*/
public class Dollar implements Currency {
@Override
public double getExchangeRate() {
return 0.147;
}
}
/**
* @version V1.0
* @description:
* @author: yuqing
* @date: 2020/9/22 10:01
*/
public class Euro implements Currency {
@Override
public double getExchangeRate() {
return 0.1249;
}
}
这样设计的话,每当我们新增一个币种的话,增加一个类就可以,如果汇率变动也只需要修改其中一个类就能实现,这样我们就满足了单一职责原则。