设计模式七大原则之单一职责原则

单一职责原则:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

也就是类A 如果负责两项任务T1和T2,如果当T1职责需求变更需要修改类A,可能会对T2导致影响或故障

这个时候我们就需要将任务T1和T2分离开来,遵循单一原则,既修改T1,T2不受影响

 举个例子:

class Animal{
    public void Run(String animal){
       System.out.println(animal+"在地上跑");
    }
}

public class Client{
    public static void main(String[] args){
       Animal animal = new Animal();
       animal.Run("");
       animal.Run("");
       animal.Run("");
    }
}

 

运行结果:

    牛在地上跑

    羊在地上跑

    猪在地上跑

这没什么问题,但有一天我们需要修改需求,出现了鱼,鸟,水下和飞禽,这些动物,总不可能也是在地上跑的吧?

我们来进行修改

class Animal{
    public void Run(String animal){
       System.out.println(animal+"在地上跑");
    }

 public void AquaticRun(String animal){
       System.out.println(animal+"在水下游");
    }

 public void BirdRun(String animal){
       System.out.println(animal+"在天上飞");
    }


}

public class Client{
    public static void main(String[] args){
       Animal animal = new Animal();
       animal.Run("");
       animal.Run("");
       animal.Run("");
       animal.BirdRun("猫头鹰");
       animal.AquaticRun("鲨鱼");
    }
}

 

运行结果:

    牛在地上跑

    羊在地上跑

    猪在地上跑

    猫头鹰在天上飞

    鲨鱼在水里游

 

很显然,只需要增加一个方法就可以满足我们的要求,简单粗暴,但这种方式违反了单一原则,一个类只负责一项业务职责,我们接着通过遵循单一原则进行最后修改

class Animal{
    public void Run(String animal){
       System.out.println(animal+"在地上跑");
    }
}

class AquaticAnimal{
   public void Run(String animal){
       System.out.println(animal+"在水下游");
     }
}

class BirdAnimal{
   public void Run(String animal){
       System.out.println(animal+"在天上飞");
     }
}


public class Client{
    public static void main(String[] args){
       Animal animal = new Animal();
       animal.Run("");
       animal.Run("");
       animal.Run("");
       AquaticAnimal aquatic=new AquaticAnimal();  
       aquatic.Run("鲨鱼");
       BirdAnimal  bird =new BirdAnimal();
       aquatic.Run("猫头鹰");
    }
}

 

这样如果新增一类动物,只需要新加一个类就可以了,不会影响其他职责,单一职责原则,主要是控制粒度大小,实现高内聚低耦合

 

posted @ 2019-11-21 21:21  虔城墨客  阅读(292)  评论(0编辑  收藏  举报