zoukankan      html  css  js  c++  java
  • 设计模式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();
      }
    

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

  • 相关阅读:
    百度地图设置div样式宽高为百分比不显示地图
    C#添加修改控件css样式
    斐波那契查找原理详解与实现
    JavaWeb 如何在web.xml中配置多个servlet
    eclipse中添加tomcat ServerName 无法输入
    java 面试题
    JSON 转 对象
    Eclipse 导入Maven 项目报错
    Mybatis 中 update 语句 动态 语句
    oracle 将当前系统时间戳插入timestamp字段
  • 原文地址:https://www.cnblogs.com/xiaoqingtian/p/13700892.html
Copyright © 2011-2022 走看看