重温设计模式之软件设计原则-单一职责原则

单一职责原则定义

单一职责原则的英文名称是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;
    }
}

这样设计的话,每当我们新增一个币种的话,增加一个类就可以,如果汇率变动也只需要修改其中一个类就能实现,这样我们就满足了单一职责原则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值