設計模式6大原則之【單一職責原則】
阿新 • • 發佈:2020-09-20
單一職責原則定義
不要存在多於一個導致類變更的原因
或者可以定義為:就一個類而言,應該只有一個引起它變化的原因
一個類/介面/方法只負責一項職責
單一職責原則優點
單一職責原則的核心就是控制類的粒度大小、將物件解耦、提高其內聚性。如果遵循單一職責原則將有以下優點。
- 降低類的複雜度。一個類只負責一項職責,其邏輯肯定要比負責多項職責簡單得多。
- 提高類的可讀性。複雜性降低,自然其可讀性會提高。
- 提高系統的可維護性。可讀性提高,那自然更容易維護了。
- 變更引起的風險降低。變更是必然的,如果單一職責原則遵守得好,當修改一個功能時,可以顯著降低對其他功能的影響。
單一職責原則實現
一個違反單一職責的反例
有一個動物類(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();
}
這樣修改之後的有點顯而易見了,如果要新增型別只需新增類即可,不會對原有類存在風險,並且降低了每個類的複雜性和可讀性