單一職責原則 單一職責原則:一個類應該只有一個原因引起改變,即一個類應該只負責一個業務邏輯。 問題由來:類T負責t1, t2兩個職責,當因為t1j對類T修改的時候,可能導致類T出現問題而影響職責t2。 解決方案:遵循單一職責原則,將類T進行改寫,確保一個類負責一個職責。 demo: 有一個類Anim ...
單一職責原則
單一職責原則:一個類應該只有一個原因引起改變,即一個類應該只負責一個業務邏輯。
問題由來:類T負責t1, t2兩個職責,當因為t1j對類T修改的時候,可能導致類T出現問題而影響職責t2。
解決方案:遵循單一職責原則,將類T進行改寫,確保一個類負責一個職責。
demo:
有一個類Animal,具有方法breath功能,一般的思路是這樣子設計的:
class Animal {
public void breathe(String animal) {
System.out.println(animal + "呼吸空氣");
}
}
當你創建一個Animal實例後,就可以調用breathe方法了。
public class SingletonResponsibility {
public static void main(String[] args) {
Animal animal = new Animal();
animal.breathe("鳥類");
animal.breathe("獅子");
//邏輯錯誤:魚類應該呼吸水
animal.breathe("魚類");
}
}
我們發現,當調用breathe方法時,若是傳入魚類,輸出結果不會發生變化。但是,這在邏輯上面是錯誤的。
改進思路1:在breathe方法中進行判斷
通過判斷,區別對待:若是魚類,則輸出“呼吸水”;其他的動物,輸出“呼吸空氣”;
這樣做的好處是:能夠爆出業務邏輯的正確;但是違反了單一職責原則:類Animal除了負責正常的業務羅傑,還需要進行類型判斷。
class Animal1 {
public void breathe(String animal) {
// 改進: 在方法中對animal進行判斷,如果是魚類,則顯示呼吸水
// 弊端: 沒有尊新單一職責原則,該方法除了需要執行正常的業務邏輯外,
// 還需要對animal進行判斷。
if ("魚類".equals(animal)) {
System.out.println(animal + "呼吸水");
} else {
System.out.println(animal + "呼吸空氣");
}
}
}
改進思路2:對類、方法進行拆分
為了保證遵循單一職責原則,我們可以將類、方法進行拆分,並且保證了也為邏輯的正確。
class Animal2 {
// 改進: 新增一個呼吸水的方法,這種方式雖然在類級別違反了單一職責原則,
// 但是在方法上遵循了。
// 註意: 單一職責原則在實際使用中,指的是遵循單一的業務邏輯。
public void breathe(String animal) {
System.out.println(animal + "呼吸空氣");
}
public void breatheWater(String animal) {
System.out.println(animal + "呼吸水");
}
}
單一職責的優點:
1.降低類的負責度,一個類只對一個業務邏輯負責;
2.提高項目的可讀性,可維護性;
3.j降低項目變更的風險;
註意事項:
在項目中,我們應該儘量遵循單一職責原則,但是,當業務邏輯較簡單時,可以違背。