• 设计模式6大原则之【单一职责原则】


    单一职责原则定义

    不要存在多于一个导致类变更的原因
    或者可以定义为:就一个类而言,应该只有一个引起它变化的原因
    一个类/接口/方法只负责一项职责

    单一职责原则优点

    单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。如果遵循单一职责原则将有以下优点。

    • 降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。
    • 提高类的可读性。复杂性降低,自然其可读性会提高。
    • 提高系统的可维护性。可读性提高,那自然更容易维护了。
    • 变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。

    单一职责原则实现

    一个违反单一职责的反例

    有一个动物类(Animal),定义了动物移动的方法

    public class Animal {
        public void Move(String name){
            System.out.println(name+"用脚走路");
        }
    }
    

    测试类进行测试

    public static void main(String[] args) {
           Animal animal = new Animal();
        animal.Move("狗");
    }
    

    执行测试方法打印出 狗用脚走路
    但是我们现在发现,鱼和鸟类也是动物,但是用脚走路是不对的,改如何解决呢?

    修改动物类

    public class Animal {
        public void Move(String name){
            if("鱼".equals(name)){
                System.out.println(name+"在水里游");
            }
            else if("鸟".equals(name)){
                System.out.println(name+"用翅膀飞");
            }else{
                System.out.println(name+"用脚走路");
            }
        }
    }
    

    测试类

    public class Test {
        public static void main(String[] args) {
            Animal animal = new Animal();
            animal.Move("狗");
            animal.Move("鱼");
            animal.Move("鸟");
        }
    }
    

    执行测试方法,打印

    狗用脚走路
    鱼在水里游
    鸟用翅膀飞
    
    我们发现如果这样修改花销是很大的,除了修改原来的类之外,还需要修改客户端。假如我们又新增了一种类型的动物,那么又得修改Move方法,这样是违反单一职责的

    最佳实现

    我们应该按照动物的类型将其分开,每种类只执行一种类型的方法

    鱼类

    public class AnimalFish {
        public void Move(){
            System.out.println("鱼类在水里游");
        }
    }
    

    鸟类

    public class AnimalBird {
        public void Move(){
            System.out.println("鸟类用翅膀飞");
        }
    }
    

    陆地动物类

    public class AnimalLand {
        public void Move(){
            System.out.println("陆地动物用脚走路");
        }
    }
    

    测试类

    public static void main(String[] args) {
           AnimalBird animalBird = new AnimalBird();
          animalBird.Move();
          AnimalFish animalFish = new AnimalFish();
          animalFish.Move();
          AnimalLand animalLand = new AnimalLand();
          animalLand.Move();
      }
    

    这样修改之后的有点显而易见了,如果要新增类型只需新增类即可,不会对原有类存在风险,并且降低了每个类的复杂性和可读性

  • 相关阅读:
    一个简单的aJax——后台用servlet技术
    js获取项目根路径
    在SpringMVC利用MockMvc进行单元测试
    java.lang.NoSuchMethodError: javaxservlet.http.HttpServletRequest.isAsyncStarted()Z
    保利威视点播集成
    微信登录后返回微信名等信息
    极光推送发送控制/别名/取值
    每天首次登陆记录设备信息
    获取APK签名
    权限管理AppOpsManager
  • 原文地址:https://www.cnblogs.com/xiaoqingtian/p/13700892.html
Copyright © 2020-2023  润新知