設(shè)計(jì)模式 - 七大設(shè)計(jì)原則(二)

概述

簡(jiǎn)單介紹一下七大設(shè)計(jì)原則:
開(kāi)閉原則:是所有面向?qū)ο笤O(shè)計(jì)的核心,對(duì)擴(kuò)展開(kāi)放整慎,對(duì)修改關(guān)閉
依賴倒置原則:針對(duì)接口編程,依賴于抽象而不依賴于具體
單一職責(zé)原則:一個(gè)接口只負(fù)責(zé)一件事情围苫,只能有一個(gè)原因?qū)е骂愖兓?br> 接口隔離原則:使用多個(gè)專門的接口裤园,而不是使用一個(gè)總接口
迪米特法則(最少知道原則):只和朋友交流(成員變量、方法輸入輸出參數(shù))剂府,不和陌生人說(shuō)話拧揽,控制好訪問(wèn)修飾符
里氏替換原則:子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能
合成復(fù)用原則:盡量使用對(duì)象組合(has-a)/聚合(contanis-a),而不是繼承關(guān)系達(dá)到軟件復(fù)用的目的


單一職責(zé)原則

定義

單一職責(zé)(Simple Responsibility Pinciple淤袜,SRP)是指不要存在多于一個(gè)導(dǎo)致類變更 的原因痒谴。

假設(shè)我們有一個(gè) Class 負(fù)責(zé)兩個(gè)職責(zé),一旦發(fā)生需求變更铡羡,修改其中一個(gè)職責(zé)的邏輯代碼积蔚,有可能會(huì)導(dǎo)致另一個(gè)職責(zé)的功能發(fā)生故障。這樣一來(lái)烦周,這個(gè) Class 存在兩個(gè)導(dǎo) 致類變更的原因尽爆。如何解決這個(gè)問(wèn)題呢?我們就要給兩個(gè)職責(zé)分別用兩個(gè) Class 來(lái)實(shí)現(xiàn), 進(jìn)行解耦读慎。后期需求變更維護(hù)互不影響漱贱。這樣的設(shè)計(jì),可以降低類的復(fù)雜度贪壳,提高類的 可讀性饱亿,提高系統(tǒng)的可維護(hù)性,降低變更引起的風(fēng)險(xiǎn)闰靴”肓總體來(lái)說(shuō)就是一個(gè) Class/Interface/Method 只負(fù)責(zé)一項(xiàng)職責(zé)。

示例

接下來(lái)我們參考《設(shè)計(jì)模式之禪》一書(shū)中所提到關(guān)于用戶信息管理的示例來(lái)舉例:

新建用戶信息IUserInfo類:

/**
 * @author eamon.zhang
 * @date 2019-09-25 下午4:07
 */
public interface IUserInfo {
    void setUserID(String userID);
    String getUserID();
    void setPassword(String password);
    String getPassword();
    void setUserName(String userName);
    String getUserName();
    boolean changePassword(String oldPassword);
    boolean deleteUser();
    void mapUser();
    boolean addOrg(int orgID);
    boolean addRole(int roleID);
}

用戶信息維護(hù)類圖:

用戶信息維護(hù)類圖

如果像這樣子來(lái)設(shè)計(jì)蚂且,即使是一個(gè)初級(jí)程序員也可以看出這個(gè)解耦設(shè)計(jì)得有問(wèn)題配猫,用戶的屬性和用戶的行為沒(méi)有分離開(kāi)。應(yīng)該把用戶的信息抽離成為一個(gè)BO杏死,把行為抽離成為一個(gè)Biz(業(yè)務(wù)邏輯)泵肄。然后我們修改這個(gè)接口。
創(chuàng)建 IUserBo 類:

/**
 * @author eamon.zhang
 * @date 2019-09-25 下午4:18
 */
public interface IUserBO {
    void setUserID(String userID);
    String getUserID();
    void setPassword(String password);
    String getPassword();
    void setUserName(String userName);
    String getUserName();
}

創(chuàng)建 IUserBiz 類:

/**
 * @author eamon.zhang
 * @date 2019-09-25 下午4:18
 */
public interface IUserBiz {
    boolean changePassword(String oldPassword);
    boolean deleteUser();
    void mapUser();
    boolean addOrg(int orgID);
    boolean addRole(int roleID);
}

職責(zé)劃分后的類圖:

我們將IUserInfo拆分為了IUserBoIUserBiz淑翼。我們就實(shí)現(xiàn)了兩個(gè)類的單一職責(zé),也就是讓引起他們變化原因只有一種,并且讓相關(guān)性強(qiáng)的內(nèi)容聚合在一個(gè)類內(nèi)部腐巢。

但是,我們?cè)趯?shí)際開(kāi)發(fā)中會(huì)項(xiàng)目依賴玄括,組合冯丙,聚合這些關(guān)系,還有還有項(xiàng)目的規(guī)模遭京,周期胃惜,技術(shù)人員的水平,對(duì)進(jìn)度的把控哪雕,很多類都不符合單一職責(zé)船殉。但是,我們?cè)诰帉?xiě)代碼的過(guò)程斯嚎,盡可能地讓接口和方法保持 單一職責(zé)利虫,對(duì)我們項(xiàng)目后期的維護(hù)是有很大幫助的挨厚。


接口隔離原則

定義

接口隔離原則(Interface Segregation Principle, ISP)是指用多個(gè)專門的接口,而不使 用單一的總接口列吼,客戶端不應(yīng)該依賴它不需要的接口幽崩。這個(gè)原則指導(dǎo)我們?cè)谠O(shè)計(jì)接口時(shí) 應(yīng)當(dāng)注意一下幾點(diǎn):

  1. 一個(gè)類對(duì)一類的依賴應(yīng)該建立在最小的接口之上。
  2. 建立單一接口寞钥,不要建立龐大臃腫的接口慌申。
  3. 盡量細(xì)化接口,接口中的方法盡量少(不是越少越好理郑,一定要適度)蹄溉。

接口隔離原則符合我們常說(shuō)的高內(nèi)聚低耦合的設(shè)計(jì)思想,從而使得類具有很好的可讀性您炉、 可擴(kuò)展性和可維護(hù)性柒爵。我們?cè)谠O(shè)計(jì)接口的時(shí)候,要多花時(shí)間去思考赚爵,要考慮業(yè)務(wù)模型棉胀,包括以后有可能發(fā)生變更的地方還要做一些預(yù)判。所以冀膝,對(duì)于抽象唁奢,對(duì)業(yè)務(wù)模型的理解 是非常重要的。

示例

下面我們來(lái)看一段代碼窝剖,寫(xiě)一個(gè)動(dòng)物行為的抽象:

IAnimal 接口:

/**
 * @author eamon.zhang
 * @date 2019-09-25 下午4:56
 */
public interface IAnimal {
    void eat();
    void fly();
    void swim();
}

Bird 類實(shí)現(xiàn):

/**
 * @author eamon.zhang
 * @date 2019-09-25 下午4:57
 */
public class Bird implements IAnimal {
    public void eat() {
    }

    public void fly() {
    }

    public void swim() {
    }
}

Dog 類實(shí)現(xiàn):

/**
 * @author eamon.zhang
 * @date 2019-09-25 下午4:57
 */
public class Dog implements IAnimal {
    public void eat() {
    }

    public void fly() {
    }

    public void swim() {
    }
}

可以看出麻掸,Birdswim()方法可能只能空著,Dogfly()方法顯然不可能的赐纱。這時(shí)候脊奋,我們針對(duì)不同動(dòng)物行為來(lái)設(shè)計(jì)不同的接口,分別設(shè)計(jì) IEatAnimal疙描,IFlyAnimalISwimAnimal 接口诚隙,來(lái)看代碼:

IEatAnimal 接口:

/**
 * @author eamon.zhang
 * @date 2019-09-25 下午4:59
 */
public interface IEatAnimal {
    void eat();
}

IFlyAnimal 接口:

/**
 * @author eamon.zhang
 * @date 2019-09-25 下午5:01
 */
public interface IFlyAnimal {
    void fly();
}

ISwimAnimal 接口:

/**
 * @author eamon.zhang
 * @date 2019-09-25 下午5:02
 */
public interface ISwimAnimal {
    void swim();
}

Dog 只實(shí)現(xiàn) IEatAnimalISwimAnimal 接口:

/**
 * @author eamon.zhang
 * @date 2019-09-25 下午4:57
 */
public class Dog implements IEatAnimal,ISwimAnimal {

    public void eat() {

    }

    public void swim() {

    }
}

來(lái)看下兩種類圖的對(duì)比,還是非常清晰明了的:


聲明

內(nèi)容為原創(chuàng)起胰,轉(zhuǎn)發(fā)請(qǐng)注明出處久又!
部分內(nèi)容參考網(wǎng)絡(luò),侵刪待错!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末籽孙,一起剝皮案震驚了整個(gè)濱河市烈评,隨后出現(xiàn)的幾起案子火俄,更是在濱河造成了極大的恐慌,老刑警劉巖讲冠,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓜客,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)谱仪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門玻熙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人疯攒,你說(shuō)我怎么就攤上這事嗦随。” “怎么了敬尺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵枚尼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我砂吞,道長(zhǎng)署恍,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任蜻直,我火速辦了婚禮盯质,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘概而。我一直安慰自己呼巷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布到腥。 她就那樣靜靜地躺著朵逝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乡范。 梳的紋絲不亂的頭發(fā)上配名,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音晋辆,去河邊找鬼渠脉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瓶佳,可吹牛的內(nèi)容都是我干的芋膘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼霸饲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼为朋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起厚脉,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤习寸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后傻工,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體霞溪,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孵滞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸯匹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坊饶。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖殴蓬,靈堂內(nèi)的尸體忽然破棺而出匿级,到底是詐尸還是另有隱情,我是刑警寧澤染厅,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布根蟹,位于F島的核電站,受9級(jí)特大地震影響糟秘,放射性物質(zhì)發(fā)生泄漏简逮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一尿赚、第九天 我趴在偏房一處隱蔽的房頂上張望散庶。 院中可真熱鬧,春花似錦凌净、人聲如沸悲龟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)须教。三九已至,卻和暖如春斩芭,著一層夾襖步出監(jiān)牢的瞬間轻腺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工划乖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贬养,地道東北人杜耙。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓翠勉,卻偏偏與公主長(zhǎng)得像导梆,于是被迫代替她去往敵國(guó)和親猾骡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 經(jīng)過(guò)一面篩選的簡(jiǎn)歷放在了易伯言的辦公桌上鸿染。HR總監(jiān)都輝來(lái)向易伯言匯報(bào)面試薪酬經(jīng)理的情況板祝。易伯言接過(guò)都輝篩選出的簡(jiǎn)歷...
    小食光閱讀 371評(píng)論 5 0
  • 初看寶玉“望杏流淚”這段短小的文字時(shí)肛循,就非常喜歡庆寺。明明是美景蚊夫,卻寫(xiě)出了憂愁!景的美與不美止邮,關(guān)鍵看欣賞者的心情这橙! 心...
    蘿卜丁兒閱讀 318評(píng)論 2 3
  • 這個(gè)世界上有一千種等待,最好的那一種叫來(lái)日可期导披。很喜歡這句話屈扎,來(lái)日可期……無(wú)數(shù)種可能。按照既定的步子前行撩匕,不問(wèn)結(jié)果...
    簡(jiǎn)寧yww閱讀 266評(píng)論 0 0
  • 一鹰晨、 @風(fēng)一樣的女孩 下午7:10 [表情] [表情] [表情] @莫林【實(shí)習(xí)輔導(dǎo)員】?溝通失敗,他經(jīng)常很晚回來(lái)止毕,...
    汶靜兒閱讀 453評(píng)論 0 0