• 设计模式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();
      }
    

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

  • 相关阅读:
    设计一个移动应用的本地缓存机制
    LeetCode 15
    POJ 2411
    Mahout构建图书推荐系统【一起学Mahout】
    firefox篇
    zTree实现删除树节点
    Tomcat与Servlet工作流程
    cocos2d 重写顶点着色语言
    将HTML格式的String转化为HTMLElement
    JQuery总结
  • 原文地址:https://www.cnblogs.com/xiaoqingtian/p/13700892.html
Copyright © 2020-2023  润新知