面向对象设计--单一职责原则

2019-02-28  本文已影响0人  NealLemon

定义

代码理解

这个原则其实很简单,就是一个类、接口、方法只负责一项职责。

场景

比如我们日常生活中的紧急呼叫 报警:110,火警电话:119,急救电话:120 。下面让我们用JAVA实现一下这个场景。

错误实现

定义一个 紧急呼叫的类。其中有呼叫的方法,根据呼叫的电话号码来判断呼叫的类型。

/**
 * @ClassName EmergencyCall
 * @Description 紧急呼叫类
 * @Author Neal
 * @Date 2019/2/28 15:37
 * @Version 1.0
 */
public class EmergencyCall {

    /**
     * 拨打紧急电话
     * @param type
     */
    public void call(int phoneNum) {
        if(phoneNum == 110) {
            System.out.println("拨打报警电话");
        }else if(phoneNum == 120) {
            System.out.println("拨打火警电话");
        }else if(phoneNum == 119) {
            System.out.println("拨打急救电话");
        }else{
            System.out.println("未知呼叫");
        }
    }

}

这种方式虽然一个方法实现了所有的场景要求,但是有一个弊端,如果我们出国,那么紧急呼叫必然不是这些电话,所以我们要新增呼叫电话和类型,这样有可能会影响或者与之前的呼叫类型冲突,所以我们就需要遵循单一职责原则。

单一职责

1.定义紧急呼叫接口

/**
 * @InterfaceName ICall
 * @Description 呼叫接口
 * @Author Neal
 * @Date 2019/2/28 16:28
 * @Version 1.0
 */
public interface ICall {
    void call();
}

2.单独的报警类以及单独的火警类

/**
 * @ClassName CallPolice
 * @Description 报警
 * @Author Neal
 * @Date 2019/2/28 16:29
 * @Version 1.0
 */
public class CallPolice implements ICall {

    public void call() {
        System.out.println("拨打报警电话");
    }
}
/**
 * @ClassName CallFireBrigade
 * @Description 火警
 * @Author Neal
 * @Date 2019/2/28 16:31
 * @Version 1.0
 */
public class CallFireBrigade implements ICall {

    public void call() {
        System.out.println("拨打火警电话");
    }
}

这种就是单一职责原则的一种实现,这种实现虽然创建了很多类,但是每个类单独负责一个职责,如果要在火警中增加灭火方法。那么只需要找到火警的类,去修改其方法就可以了。 对其他的类和方法没有任何影响。但是在第一种错误实现时,就会有影响,因为他影响了原有类的结构,万一调用错误,在报完急救之后吴调用灭火方法,那就太尴尬了。

总结

其实在我们正常的WEB项目开发中,基本的单一职责就是 分controller,service,dao层,这就是一种体现,当然有时候我们在接到需求的时候,由于要修改太多东西,可能不会去考虑这一原则的具体实施。

上一篇 下一篇

猜你喜欢

热点阅读