六大設(shè)計(jì)原則 筆記

首先感謝宗傳奇大神 送了我一本《設(shè)計(jì)模式之禪》呀忧,春節(jié)期間把這本書(shū)快速的讀了一遍。
很久前對(duì)設(shè)計(jì)原則有過(guò)學(xué)習(xí),但并沒(méi)有去在意滥壕。最近幾天寫(xiě)代碼,發(fā)現(xiàn)寫(xiě)代碼的時(shí)候腦子里會(huì)冒出這用的是‘開(kāi)閉原則’兽泣,或 準(zhǔn)備寫(xiě)代碼的 問(wèn)一下自己會(huì)用到什么原則绎橘。雖然設(shè)計(jì)原則不能幫助你現(xiàn)實(shí)任何業(yè)務(wù),也不能明顯的減少代碼的開(kāi)發(fā)量唠倦,但是很神奇称鳞。說(shuō)它是禪,一點(diǎn)都不過(guò)分稠鼻。
由于領(lǐng)悟尚淺冈止,方便回味,自己寫(xiě)了簡(jiǎn)潔的案例候齿;同時(shí)也希望各位大神熙暴,建議指導(dǎo);


  • 開(kāi)閉原則(Open-Closed Principle, OCP)

一個(gè)軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開(kāi)放慌盯,對(duì)修改關(guān)閉周霉。即軟件實(shí)體應(yīng)盡量在不修改原有代碼的情況下進(jìn)行擴(kuò)展。

重構(gòu)前亚皂,只要節(jié)目有變就要改春晚代碼

    //春晚演節(jié)目  (重構(gòu)前)
    public void chunWan(String name){
        if("賈玲".equals(name)){
            JiaLing jiaLing=new JiaLing();
            jiaLing.xiaoPin();
        }else if("王菲".equals(name)){
            Wangfei wangfei=new Wangfei();
            wangfei.changGe();
        }
    }

重構(gòu)后俱箱,讓春晚演節(jié)目更靈活。

    //春晚演節(jié)目  (重構(gòu)后)
    public void chunWan(YanYuan yanYuan){
        yanYuan.biaoYan();
    }

    //抽象出一個(gè)演員抽象類(lèi),添加一個(gè)biaoYan抽象方法.
    public abstract class YanYuan {
        public abstract void biaoYan();
    }

    //讓賈玲繼承 演員抽象類(lèi)  并實(shí)現(xiàn)biaoYan抽象方法.
    public class JiaLing extends YanYuan{
        @Override
        public void biaoYan() {
            System.out.println("賈玲開(kāi)始小品表演");
        }
    }
    //王菲亦如此,實(shí)現(xiàn)表演唱歌. 從此所有人繼承演員就可以上春晚了!
...

  • 里氏替換原則(Open-Closed Principle, OCP)

    子類(lèi)可以擴(kuò)展父類(lèi)的功能灭必,但不能改變父類(lèi)原有的功能狞谱。所有引用父類(lèi)的地方必須能透明地使用其子類(lèi)的對(duì)象。
重構(gòu)前禁漓,功能混亂沒(méi)有約束跟衅,容易出錯(cuò),弄不好就掛了璃饱。

    public static void main(String[] args) {
        Guo guo = new PingDiGuo();
        //找個(gè) 鍋 來(lái) 烹飪
        zuoFan(guo);
        //結(jié)果 拿鍋拍人去了
    
    }
    //傳入鍋來(lái)做飯
    public static void zuoFan(Guo guo){
        guo.function();
    }
    //可以做飯的鍋類(lèi)
    public static class Guo{
        public void function(){
            System.out.println("我來(lái)烹飪了");
        }
    }
    //一只平底鍋
    public static class PingDiGuo extends Guo{
        public void function(){
            System.out.println("發(fā)現(xiàn)平底鍋,可以殺人越貨,我要維護(hù)世界和平");
        }
    }

重構(gòu)后与斤,保留鍋的本質(zhì)功能,平底鍋特有功能應(yīng)該獨(dú)自實(shí)現(xiàn)。

    public static void main(String[] args) {
        Guo guo = new PingDiGuo();
        //找個(gè) 鍋 來(lái) 烹飪
        zuoFan(guo);
        //鍋的本質(zhì)功能 被保留
    
    }
    //傳入鍋來(lái)做飯
    public static void zuoFan(Guo guo){
        guo.function();
    }
    //可以做飯的鍋類(lèi)
    public static class Guo{
        public final void function(){
            System.out.println("我來(lái)烹飪了");
        }
    }
    //一只平底鍋
    public static class PingDiGuo extends Guo{
        public void newFunction(){
            System.out.println("發(fā)現(xiàn)平底鍋,可以殺人越貨,我要維護(hù)世界和平");
        }
    }

小結(jié): 子類(lèi)可以擴(kuò)展父類(lèi)的功能撩穿,但不能改變父類(lèi)原有的功能磷支。

里氏替換原則 舉例非常困難,簡(jiǎn)單的總結(jié)一下
1:不能重寫(xiě)父類(lèi)本質(zhì)的非抽象方法食寡。
2:父類(lèi)本質(zhì)功能,不想被重寫(xiě)可以加 final雾狈。
3:在子類(lèi)中增加自己特有的方法。
4:當(dāng)子類(lèi)的方法重載父類(lèi)的方法時(shí)抵皱,方法的前置條件(即方法的形參)要比父類(lèi)方法的輸入?yún)?shù)更寬松善榛。
5:當(dāng)子類(lèi)的方法實(shí)現(xiàn)父類(lèi)的抽象方法時(shí),方法的后置條件(即方法的返回值)要比父類(lèi)更嚴(yán)格呻畸。


  • 依賴(lài)倒置原則(Dependency Inversion Principle, DIP)

高層模塊不應(yīng)該依賴(lài)低層模塊移盆,兩者都應(yīng)該依賴(lài)其抽象。抽象不應(yīng)該依賴(lài)于細(xì)節(jié)伤为。
細(xì)節(jié)應(yīng)當(dāng)依賴(lài)于抽象咒循。換言之,要針對(duì)接口編程绞愚,而不是針對(duì)實(shí)現(xiàn)編程叙甸。

重構(gòu)前,擴(kuò)展差位衩,不符合開(kāi)閉原則裆蒸。并且功能容易混亂。

    //有個(gè)唱歌節(jié)目 傳進(jìn)不同的人唱歌
    public void play(People ren){
        ren.changGe();
    }
    //過(guò)了一段時(shí)間突然有只 鳥(niǎo) 也來(lái)節(jié)目 唱歌 ,然后節(jié)目 擴(kuò)展 了一個(gè) 方法
    public void play(Bird niao){
        niao.changGe();
    }
    //漸漸時(shí)間舊了,發(fā)現(xiàn)兩個(gè)問(wèn)題 ,
    //  1:不是所有的人或鳥(niǎo)都會(huì)唱歌;
    //  2:還有其他動(dòng)物也會(huì)唱歌;

重構(gòu)后糖驴,想去參加唱歌節(jié)目僚祷,就必須實(shí)現(xiàn)唱歌,簡(jiǎn)單清楚遂赠。

    //抽象出一個(gè) 歌曲類(lèi) , 有開(kāi)始唱的功能;
    public abstract class Song{
        public abstract void play();
    }
    
    // 節(jié)目組做了調(diào)整 , 需求更明確 , 要求會(huì)唱歌的來(lái), 不會(huì)唱歌的就不能來(lái)
    public void play(Song geQu){
        geQu.play();
    }
    
    //所以 接下來(lái) 想去 參加節(jié)目的 就必須要會(huì)唱歌   (實(shí)現(xiàn)Song)


  • 接口隔離原則(Interface Segregation Principle, ISP)

客戶端不應(yīng)該依賴(lài)它不需要的接口久妆。類(lèi)間的依賴(lài)關(guān)系應(yīng)該建立在最小的接口上。

重構(gòu)前跷睦,

    //有個(gè)演員抽象類(lèi) 會(huì)唱歌  繼承了唱歌 功能
    public interface YanYuan extends Song{
        void playSong();
    }
    //節(jié)目 邀請(qǐng) 演員 來(lái)唱歌
    public void JieMu(YanYuan yanYuan){
        yanYuan.playSong();
    }

重構(gòu)后,

    //演員抽象類(lèi) 會(huì)唱歌
    public interface YanYuan  {
        void playSong(Song song);
    }
    //節(jié)目開(kāi)始    歌 被演員唱了起來(lái)
    public void JieMu(YanYuan yanYuan){
        yanYuan.playSong(getSong());
    }
    
    //接口隔離原則能從很多 維度舉例; 拆分細(xì)化等;
    //個(gè)人看標(biāo)題的表面意思 理解 更偏向于,接口回調(diào),接口解耦方面....


  • 迪米特法則(Law of Demeter, LoD)

一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少地與其他實(shí)體發(fā)生相互作用肋演。

重構(gòu)前抑诸,

    //一個(gè)教室類(lèi) 里面有很多電器
    public class JiaoShi{
        //各種電器
        public KongTiao kongTiao;//空調(diào)
        public Deng deng;//燈
        public YinShuiJi yinShuiJi;//飲水機(jī)
        ....
    }
    //一個(gè)老師類(lèi) 有檢查關(guān)閉電源 的方法
    public class Teacher{
        public void jianChaDianYuan(JiaoShi jiaoShi){
            jiaoShi.kongTiao.close();//關(guān)空調(diào)
            jiaoShi.deng.close();//關(guān)燈
            jiaoShi.yinShuiJi.close();//關(guān)飲水機(jī)
        }
    }
    //老師需要 知道所有電器 并關(guān)閉
重構(gòu)后,

    //一個(gè)教室類(lèi) 里面有很多電器
    public class JiaoShi{
        //各種電器
        public KongTiao kongTiao;//空調(diào)
        public Deng deng;//燈
        public YinShuiJi yinShuiJi;//飲水機(jī)
        ....
        //一個(gè) 開(kāi)關(guān)
        public void closeAll(){
            jiaoShi.kongTiao.close();//關(guān)空調(diào)
            jiaoShi.deng.close();//關(guān)燈
            jiaoShi.yinShuiJi.close();//關(guān)飲水機(jī)
        }
    }
    
    //一個(gè)老師類(lèi) 只需要知道一個(gè)開(kāi)關(guān)即可
    public class Teacher{
        public void jianChaDianYuan(JiaoShi jiaoShi){
            jiaoShi.closeAll();
        }
    }
    
    //還有一個(gè)層面的理解: 抽出一個(gè) 總閘開(kāi)關(guān) 接口, 有個(gè)抽象方法 closeAll(); 
    //只需要傳給老師 總閘開(kāi)關(guān) , 老師調(diào)用 總閘開(kāi)關(guān)的closeAll(),就能關(guān)閉所有電源
    //然而不需要關(guān)心具體關(guān)閉什么電器, 這樣電器 和 老師 就解耦了


  • 單一職責(zé)原則(Single Responsibility Principle, SRP)

一個(gè)類(lèi)只負(fù)責(zé)一個(gè)功能領(lǐng)域中的相應(yīng)職責(zé)爹殊,或者可以定義為:就一個(gè)類(lèi)而言蜕乡,應(yīng)該只有一個(gè)引起它變化的原因。

重構(gòu)前梗夸,

    //茶農(nóng)類(lèi), 從前有個(gè)很辛苦的 茶農(nóng) ,
    public class ChaNong{
        //他要負(fù)責(zé)種茶葉
        public void zhongCha(){
            System.out.println("種茶,收茶");
        }
        //還需要加工茶葉
        public void jiaGongCha(ChaYe chaYe){
            System.out.println("加工了100盒");
        }
        //然后去集市賣(mài)茶
        public void maiCha(ChaYe chaYe){
            System.out.println("成功賣(mài)了100盒,收到了很多錢(qián)");
        }
    }
重構(gòu)后层玲,
    
    //加工廠類(lèi), 由于茶農(nóng)辛苦 ,收益底 ,一個(gè)很有眼光的人, 開(kāi)了一家 加工茶葉銷(xiāo)售公司
    public  class JiaGongChang{
        //加工茶葉
        private void jiaGongCha(ChaYe chaYe){
            System.out.println("加工了100盒");
        }
        //然后批發(fā)茶葉到市場(chǎng)
        public Money maiCha(ChaYe chaYe){
            jiaGongCha(chaYe);
            System.out.println("成功賣(mài)了100盒,收到了很多錢(qián)");
            ...
            return money;
        }
    }
    
    //茶農(nóng)類(lèi), 從此 茶農(nóng) 就有了 清閑 的生活
    public class ChaNong{
        //他只負(fù)責(zé)種茶
        public void zhongCha(){
            System.out.println("勞動(dòng)最光榮");
        }
    
        //然后去集市賣(mài)茶
        public void maiCha(ChaYe chaYe){
            Money money =new JiaGongChang().maiCha(chaYe);
            System.out.println(money);
        }
    }


本文是作者通過(guò)再次學(xué)習(xí)后的理解總結(jié),希望能為大家?guī)?lái)幫助; 謝謝,謝謝宗傳奇贈(zèng)書(shū)

推薦鏈接: 設(shè)計(jì)模式之六大原則(轉(zhuǎn)載)
推薦鏈接: 迪米特法則

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辛块,更是在濱河造成了極大的恐慌畔派,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件润绵,死亡現(xiàn)場(chǎng)離奇詭異线椰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)尘盼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)憨愉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人卿捎,你說(shuō)我怎么就攤上這事配紫。” “怎么了午阵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵笨蚁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我趟庄,道長(zhǎng)括细,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任戚啥,我火速辦了婚禮奋单,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猫十。我一直安慰自己览濒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布拖云。 她就那樣靜靜地躺著贷笛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宙项。 梳的紋絲不亂的頭發(fā)上乏苦,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音尤筐,去河邊找鬼汇荐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盆繁,可吹牛的內(nèi)容都是我干的掀淘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼油昂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼革娄!你這毒婦竟也來(lái)了倾贰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拦惋,失蹤者是張志新(化名)和其女友劉穎匆浙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體架忌,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吞彤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叹放。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饰恕。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖井仰,靈堂內(nèi)的尸體忽然破棺而出埋嵌,到底是詐尸還是另有隱情,我是刑警寧澤俱恶,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布雹嗦,位于F島的核電站,受9級(jí)特大地震影響合是,放射性物質(zhì)發(fā)生泄漏了罪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一聪全、第九天 我趴在偏房一處隱蔽的房頂上張望泊藕。 院中可真熱鬧,春花似錦难礼、人聲如沸娃圆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讼呢。三九已至,卻和暖如春谦炬,著一層夾襖步出監(jiān)牢的瞬間悦屏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工吧寺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窜管,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓稚机,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親获搏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赖条,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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