设计模式原则篇:(1)单一职责原则--Single Responsibility Principle
????? ? ? ?? 上篇文章提及到設(shè)計(jì)模式中應(yīng)遵循的設(shè)計(jì)原則,并且列出了設(shè)計(jì)模式中應(yīng)當(dāng)遵循的六大原則。
?????? 次篇文章主要討論單一職責(zé)原則。
???????????? 單一職責(zé)原則(SRP):
???????????????????????? 不要存在多于一個(gè)導(dǎo)致類變更的原因。簡單的講,就是一個(gè)類或接口只負(fù)責(zé)一個(gè)"職責(zé)"。
????????????? 如果一個(gè)類有一個(gè)以上的職責(zé),這些職責(zé)就耦合在一起了,這種設(shè)計(jì)十分脆弱,因?yàn)楫?dāng)一個(gè)職
????????????? 則的變換很可能影響其他職責(zé),會(huì)影響復(fù)用性。
????????????????????????? 這里需要對(duì)類或接口的"職責(zé)"做一些理解,SRP中將"職責(zé)"理解為“變化的原因”,當(dāng)你有N
????????????? 個(gè)動(dòng)機(jī)去改變類的時(shí)候,那么這個(gè)類就違法了SRP原則.
?????????????????????? Tips:這里只有你去真正修改了類的時(shí)候違反了SRP原則,如果僅僅只是一種推測,并未
??????????????? 實(shí)際付之行動(dòng),不算違反之一原則。
???????????? 單一職責(zé)原則(SRP)優(yōu)點(diǎn):
??????????????? 1、可以降低類的復(fù)雜度
??????????????? 2、提高類的可讀性,系統(tǒng)的可維護(hù)性
??????????????? 3、降低變更的時(shí)候?qū)ζ渌δ艿挠绊?變更不可避免)
?????????????? 簡單舉一個(gè)例子:關(guān)于動(dòng)物吃東西的問題。
????????????????????? 編寫一個(gè)類用于描述動(dòng)物吃東西:
package com.kiritor; /** * @author Kiritor * 動(dòng)物類的描述*/ class Animal { public void eatFood(String name) { System.out.println(name+"吃草"); } } public class Client { public static void main(String[] args) { Animal animal = new Animal(); animal.eatFood("羊"); animal.eatFood("牛"); } } ?????????????? 不過這里問題就來了,并不是所有動(dòng)物都吃草的啊,也有肉食動(dòng)物的。在不違背單一????? 原則的情況下,我們必須將動(dòng)物類細(xì)分為,肉食性和素食性的。
class AnimalMeat { public void eatFood(String name) { System.out.println(name+"吃肉"); } } class AnimalGlass { public void eatFood(String name) { System.out.println(name+"吃草"); } } public class Client { public static void main(String[] args) { AnimalGlass animal = new AnimalGlass(); animal.eatFood("羊"); AnimalMeat animal2 = new AnimalMeat(); animal2.eatFood("老虎"); } }? ? ? ? ? ? ? ?? 由上述代碼可以知道,這種修改的開銷還是挺大的,不僅需要添加新類,還要修改客戶
???????? 端代碼。有事還不如這樣修改:
class Animal{ public void eatFoodGlass(String animal){ System.out.println(animal+"吃草"); } public void eatFoodMeat(String animal){ System.out.println(animal+"吃肉"); } } public class Client{ public static void main(String[] args){ Animal animal = new Animal(); animal.eatFoodGlass("牛"); animal.eatFoodGlass("羊"); animal.eatFoodMeat("老虎"); } } ???????????? 造成上述的結(jié)果就是在使用單一原則的情況下,對(duì)于"職責(zé)"的劃分沒有一個(gè)明確的標(biāo)準(zhǔn),如果????? 把職責(zé)劃分過細(xì)反而會(huì)造成接口和實(shí)現(xiàn)類的數(shù)量劇曾,反倒不利于維護(hù)和閱讀。所以在使用這個(gè)
????? 原則的時(shí)候還是要具體問題具體分析。
??????????? 建議就是接口一定要采用單一職責(zé)原則,實(shí)現(xiàn)類的設(shè)計(jì)上盡可能做到單一職責(zé)原則,最好是一個(gè)
????? 原因引起一個(gè)類的變化。
??????
轉(zhuǎn)載于:https://blog.51cto.com/kiritor/1226704
總結(jié)
以上是生活随笔為你收集整理的设计模式原则篇:(1)单一职责原则--Single Responsibility Principle的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2440-系统时钟
- 下一篇: android NDK 在Ubuntu1