1. 程式人生 > 實用技巧 >設計模式6大原則之【單一職責原則】

設計模式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();
  }

這樣修改之後的有點顯而易見了,如果要新增型別只需新增類即可,不會對原有類存在風險,並且降低了每個類的複雜性和可讀性