設(shè)計模式六大原則--單一職責(zé)原則(Single responsibility principle,SRP)


參考文章:https://blog.csdn.net/zhengzhb/article/details/7278174
參考書籍:設(shè)計模式之禪 --- 秦小波 著

定義:應(yīng)該有且只有一個原因引起類的改變
一句話描述:當(dāng)類只有一個作用時,改變這個類的原因也只有一個,即一個類只負(fù)責(zé)一類職責(zé)限寞。

代碼重現(xiàn):

public interface IUserDao {
   int serUserName(String UserName);
   String getUserNameById(String UserId);
   int setUserPassword(String Password);
   String getUserPasswordById(String UserId);
   
   boolean updateUserPassword(String Password);
   boolean deleteUser(User user);
}

public class UserDao implements  IUserDao {
                省略........
}

??現(xiàn)在有一個IUserDao 接口帖旨,這個接口有兩個職責(zé)柿赊,一個是負(fù)責(zé)User的屬性T1栅炒,一個是負(fù)責(zé)User 的行為T2取逾。顯然,對于一般程序員來講蝶溶,都不會這樣設(shè)計,沒有正確的將業(yè)務(wù)邏輯與業(yè)務(wù)對象正確區(qū)分。這樣的設(shè)計結(jié)果會導(dǎo)致一個類(接口)信息雜糅抖所,讓代碼管理陷入混亂梨州。比如當(dāng)T1發(fā)生改變時,那么IUserDao 需要修改田轧;同樣暴匠,T2變化時,IUserDao 依舊需要修改傻粘。T1每窖,T2的變化本來沒有直接影響的,但是有間接影響:T1變化導(dǎo)致IUserDao 的修改弦悉,有可能會導(dǎo)致T2發(fā)生故障風(fēng)險窒典,畢竟兩者是在同一個類中。

問題產(chǎn)生:
IUserDao接口中有T1和T2兩個職責(zé)稽莉。任意一個職責(zé)的改變瀑志,都會對IUserDao產(chǎn)生變化,這個變化最終有可能導(dǎo)致另一個職責(zé)發(fā)生故障風(fēng)險肩祥。

問題解決:
為了避免上述問題的產(chǎn)生后室,應(yīng)該將IUserDao中的T1和T2職責(zé)分開,單獨放在不同的接口中混狠,分別實現(xiàn)其職責(zé)岸霹,這樣兩者修改時,并不會接觸到另一個職責(zé)的代碼将饺,從而徹底消除影響贡避。

所以上述代碼重新拆分:

User行為接口 IUserBiz:
public interface IUserBiz {
   boolean updateUserPassword(String Password);
   boolean deleteUser(User user);
}

User屬性接口 IUserBo:
public interface IUserBo {
   int serUserName(String UserName);
   String getUserNameById(String UserId);
   int setUserPassword(String Password);
   String getUserPasswordById(String UserId);
}

當(dāng)User的屬性職責(zé)(IUserBo)發(fā)生改變時,并不會影響到行為職責(zé)(IUserBiz)予弧。

可能有人要問:IUserBo是只有一個原則:User屬性職責(zé)刮吧;IUserBiz是只有一個原則:User行為職責(zé),但是UserDao卻有兩個原則:屬性職責(zé)和行為職責(zé)掖蛤,這樣也是符合單一職責(zé)原則嗎杀捻?

其實這樣想也有道理,但是不要忘了蚓庭,我們是面向接口編程致讥,我們對外公布的是接口,而不是具體的實現(xiàn)類器赞,并且若一定要實現(xiàn)接口和類的單一職責(zé)原則垢袱,那么我們就需要在 IUserBo 和 IUserBiz 與UserDao 上再加一個各自接口的實現(xiàn)類UserBo,UserBiz港柜,然后在UserDao使用組合请契,這樣就完全滿足單一職責(zé)原則的要求。這樣寫帶來的后果是強耦合(組合是一種強耦合的關(guān)系),類的復(fù)雜性提高爽锥,數(shù)量增加涌韩,完全就是為了設(shè)計而設(shè)計。

通過上面的例子救恨,我們來總結(jié)一下單一職責(zé)原則有什么好處:
①類的復(fù)雜性降低贸辈,實現(xiàn)什么原則都有清晰明確的定義;
②可讀性提高肠槽,復(fù)雜性降低擎淤;
③可維護(hù)性提高;
④變更引起的風(fēng)險降低秸仙;

建議:接口一定要做到單一職責(zé)嘴拢,類的設(shè)計盡量做到只有一個原因引起的變化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寂纪,隨后出現(xiàn)的幾起案子席吴,更是在濱河造成了極大的恐慌,老刑警劉巖捞蛋,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孝冒,死亡現(xiàn)場離奇詭異,居然都是意外死亡拟杉,警方通過查閱死者的電腦和手機庄涡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搬设,“玉大人穴店,你說我怎么就攤上這事∧醚ǎ” “怎么了泣洞?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長默色。 經(jīng)常有香客問我球凰,道長,這世上最難降的妖魔是什么腿宰? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任弟蚀,我火速辦了婚禮,結(jié)果婚禮上酗失,老公的妹妹穿的比我還像新娘。我一直安慰自己昧绣,他們只是感情好规肴,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般拖刃。 火紅的嫁衣襯著肌膚如雪删壮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天兑牡,我揣著相機與錄音央碟,去河邊找鬼。 笑死均函,一個胖子當(dāng)著我的面吹牛亿虽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苞也,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼洛勉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了如迟?” 一聲冷哼從身側(cè)響起收毫,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎殷勘,沒想到半個月后此再,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡玲销,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年输拇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痒玩。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡淳附,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蠢古,到底是詐尸還是另有隱情奴曙,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布草讶,位于F島的核電站洽糟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏堕战。R本人自食惡果不足惜坤溃,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘱丢。 院中可真熱鬧薪介,春花似錦、人聲如沸越驻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至记劈,卻和暖如春勺鸦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背目木。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工换途, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刽射。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓军拟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親柄冲。 傳聞我的和親對象是個殘疾皇子吻谋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 目錄: 設(shè)計模式六大原則(1):單一職責(zé)原則 設(shè)計模式六大原則(2):里氏替換原則 設(shè)計模式六大原則(3):依賴倒...
    加油小杜閱讀 723評論 0 1
  • 設(shè)計模式六大原則 設(shè)計模式六大原則(1):單一職責(zé)原則 定義:不要存在多于一個導(dǎo)致類變更的原因现横。通俗的說漓拾,即一個類...
    viva158閱讀 764評論 0 1
  • 轉(zhuǎn)載標(biāo)注聲明:http://www.uml.org.cn/sjms/201211023.asp 目錄:[設(shè)計模式六...
    Bloo_m閱讀 707評論 0 7
  • 轉(zhuǎn)載自 設(shè)計模式六大原則[http://www.uml.org.cn/sjms/201211023.asp#3] ...
    廚子閱讀 1,089評論 2 5
  • 梁啟超是中國近代思想家骇两、政治家、教育家姜盈、史學(xué)家低千、文學(xué)家,同時是一等一的教子高手馏颂。 他有九個子女示血,個個了得。長子梁思...
    踏雪尋梅anan閱讀 504評論 2 1