設計模式七大原則之單一職責原則

單一職責原則:不要存在多於一個導致類變更的原因。通俗的說,即一個類只負責一項職責。

也就是類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("貓頭鷹");
    }
}

 

這樣如果新增一類動物,只需要新加一個類就可以了,不會影響其他職責,單一職責原則,主要是控制粒度大小,實現高內聚低耦合

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章