單一職責原則:不要存在多於一個導致類變更的原因。通俗的說,即一個類只負責一項職責。
也就是類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("貓頭鷹"); } }
這樣如果新增一類動物,只需要新加一個類就可以了,不會影響其他職責,單一職責原則,主要是控制粒度大小,實現高內聚低耦合