定義:
不要存在多餘一個導致類變更的原因。
public class Animal {
public void breathe(String animal) {
System.out.println(animal + "呼吸空氣");
}
}
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal animal = new Animal();
animal.breathe("牛");
animal.breathe("羊");
animal.breathe("豬");
}
}
如果這個時候添加魚,因爲魚只能呼吸水,所以需要修改Animal類:
public class Animal {
public void breathe(String animal) {
if("魚".equals(animal)){
System.out.println(animal+"呼吸水");
}else{
System.out.println(animal+"呼吸空氣");
}
}
}
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal animal = new Animal();
animal.breathe("牛");
animal.breathe("羊");
animal.breathe("豬");
animal.breathe("魚");
}
}
這樣做的話,就違背了設計模式的開放擴展,關閉修改原則。所以只能用單一職責模式來解決這個問題:
具有呼吸水職責的類:
public class Aquatic {
public void breathe(String animal) {
System.out.println(animal + "呼吸水");
}
}
具有呼吸空氣職責的類:
public class Terrestrial {
public void breathe(String animal) {
System.out.println(animal + "呼吸空氣");
}
}
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Terrestrial terrestrial = new Terrestrial();
terrestrial.breathe("牛");
terrestrial.breathe("羊");
terrestrial.breathe("豬");
Aquatic aquatic = new Aquatic();
aquatic.breathe("魚");
}
}
這樣可以不修改原來的代碼,開放擴展,也是單一職責的表現。
優點:
1、 降低類的複雜度,一個類只負責一項職責,其邏輯肯定要比負責多項職責簡單的多
2、 提高類的可讀性,提高系統的可維護性;
3、 降低變更引起的風險
特殊情況:
只有邏輯足夠簡單,纔可以在代碼級別上違反單一職責原則;
只有類中方法數量足夠少,纔可以在方法級別上違反單一職責原則;
繼承與接口的區別:
繼承類裏面,虛接口必須要在子類裏重寫,即便只有空函數體,所以需要每個子類都重寫基類方法時才繼承。
接口類裏面,虛接口不需要子類全部重寫,所以子類只部分重寫基類方法的時候,用接口類。