嘻哈說:設計模式之迪米特法則

嘻哈說-設計模式

1、疑惑

在我們剛開始學習編程的時候影兽,通常會將所有的方法都聲明為public揭斧,例如:

package com.fanqiekt.principle.lod;

/**
 * 廚師
 *
 * @author 番茄課堂-懶人
 */
public class Chef{
    public String flavour = "秘制調(diào)料XXX";

    /**
     * 做飯
     * @param dishName 下單的菜名
     */
    public void cooking(String dishName) {
        System.out.println("開始烹飪:"+dishName);

        switch (dishName){
            case "西紅柿炒雞蛋":
                cookingTomato();
                break;
            case "酸辣土豆絲":
                cookingPotato();
                break;
        }

        System.out.println(dishName + "出鍋");
    }

    /**
     * 炒西紅柿雞蛋
     */
    public void cookingTomato() {
        System.out.println("放入調(diào)料:" + flavour);
        System.out.println("先炒雞蛋");
        System.out.println("再炒西紅柿");
        System.out.println("...");
    }

    /**
     * 炒酸辣土豆絲
     */
    public void cookingPotato() {
        System.out.println("放入調(diào)料:" + flavour);
        System.out.println("先放蔥姜蒜");
        System.out.println("再放土豆絲");
        System.out.println("...");
    }
}

廚師類。

package com.fanqiekt.principle.lod;

/**
 * 客人
 * @Author: 番茄課堂-懶人
 */
public class Client {
    public static void main(String[] args){
        Chef chef = new Chef();
        chef.cooking("西紅柿炒雞蛋");
        System.out.println("-------");
        chef.cooking("酸辣土豆絲");
    }
}

客人類峻堰。

這樣做好不好讹开?

大家可以先思考下。

2捐名、定義

我們先來看一下迪米特法則的定義旦万。

又稱為最少知識原則

一個軟件實體應當盡可能少地與其他實體發(fā)生相互作用镶蹋。

這個比較好理解成艘,一個類盡可能少的與其他的類產(chǎn)生關聯(lián),低耦合贺归,高內(nèi)聚嘛淆两。

迪米特法則包含兩種角色:依賴者與被依賴者。

3拂酣、含義

我們回到疑惑中的問題秋冰,Chef類好不好?

首先踱葛,Chef類的角色是被依賴者丹莲。

它暴露了flavour屬性,這是存在問題的尸诽,有哪個廚師愿意把自己的獨家配方公開出去啊。

而且它還暴露了依賴者并不關心cookingTomato盯另、cookingPotato兩個方法性含。

對于依賴者來說,我只需要調(diào)用cooking方法就可以了鸳惯,至于菜具體怎么做商蕴,就與我無關了叠萍。

并且暴露的話,程序員也容易懵逼绪商,這兩個方法是干嘛的苛谷?我要不要研究下?

所以格郁,

從被依賴者的角度來說:只暴露應該暴露的方法或者屬性腹殿。

有個簡單的套路:

可以用private就絕不用protected,可以用protected就絕不用public例书。

那Client類總沒什么問題了吧锣尉。

確實,乍一看感覺沒有任何問題的决采,再乍乍一看還是感覺沒有問題自沧。。树瞭。

它的不合適不是從語法調(diào)用方面看的拇厢,而是從依賴關系。

客人是不可以直接依賴廚師的晒喷,而應該依賴服務員旺嬉。

在實際項目中,很可能會存在客人類依賴了廚師類厨埋、服務員類邪媳,而服務員類又依賴了廚師類。

這會讓代碼非车聪荩混亂雨效,也違背了迪米特法則。

所以废赞,

從依賴者的角度來說:只依賴應該依賴的對象徽龟。

4、代碼

我們按照迪米特法則優(yōu)化下代碼唉地。

package com.fanqiekt.principle.lod;

/**
 * 廚師
 *
 * @author 番茄課堂-懶人
 */
public class Chef{
    private String flavour = "秘制調(diào)料XXX";

    /**
     * 做飯
     * @param dishName 下單的菜名
     */
    public void cooking(String dishName) {
        System.out.println("開始烹飪:"+dishName);

        switch (dishName){
            case "西紅柿炒雞蛋":
                cookingTomato();
                break;
            case "酸辣土豆絲":
                cookingPotato();
                break;
        }

        System.out.println(dishName + "出鍋");
    }

    /**
     * 炒西紅柿雞蛋
     */
    private void cookingTomato() {
        System.out.println("放入調(diào)料:" + flavour);
        System.out.println("先炒雞蛋");
        System.out.println("再炒西紅柿");
        System.out.println("...");
    }

    /**
     * 炒酸辣土豆絲
     */
    private void cookingPotato() {
        System.out.println("放入調(diào)料:" + flavour);
        System.out.println("先放蔥姜蒜");
        System.out.println("再放土豆絲");
        System.out.println("...");
    }
}

flavour聲明為private据悔,其他類就不可訪問了,避免泄漏秘制調(diào)料耘沼。

cookingTomato极颓、cookingPotato聲明為private

cooking需要依賴者調(diào)用,所以依舊為public群嗤。

package com.fanqiekt.principle.lod;

/**
 * 服務員
 *
 * @author 番茄課堂-懶人
 */
public class Waiter {
    private Chef chef = new Chef();

    /**
     * 點餐
     * @param dishName 餐名
     */
    public void order(String dishName) {
        System.out.println("客人點餐:"+dishName);

        chef.cooking(dishName);

        System.out.println(dishName+"上桌啦菠隆,請您品嘗!");
    }
}

服務員類,依賴了Chef對象骇径,并聲明為private躯肌。

package com.fanqiekt.principle.lod;

/**
 * 客人
 * @Author: 番茄課堂-懶人
 */
public class Client {
    public static void main(String[] args){
        Waiter waiter = new Waiter();
        waiter.order("西紅柿炒雞蛋");
        System.out.println("-------");
        waiter.order("酸辣土豆絲");
    }

}

客人類,依賴了Waiter類破衔。清女。

客人點餐:西紅柿炒雞蛋
開始烹飪:西紅柿炒雞蛋
放入調(diào)料:秘制調(diào)料XXX
先炒雞蛋
再炒西紅柿
...
西紅柿炒雞蛋出鍋
西紅柿炒雞蛋上桌啦,請您品嘗晰筛!
-------
客人點餐:酸辣土豆絲
開始烹飪:酸辣土豆絲
放入調(diào)料:秘制調(diào)料XXX
先放蔥姜蒜
再放土豆絲
...
酸辣土豆絲出鍋
酸辣土豆絲上桌啦嫡丙,請您品嘗!

運行結果传惠。

5迄沫、優(yōu)點

降低風險

避免不該暴露的方法或者屬性暴露,從而規(guī)避風險卦方。

避免依賴關系過于混亂羊瘩。

6、嘻哈說

接下來盼砍,請您欣賞懶人為迪米特法則創(chuàng)作的歌曲尘吗。

嘻哈說:迪米特法則
作曲:懶人
作詞:懶人
Rapper:懶人

哥們是個大廚
身材有些發(fā)福
您可以讓我做飯甚至是打鹵
但您無權知曉我具體是油煎炸煮
這是我的秘密才能把客人抓住
這就是最小知識原則的迪米特法則
一個實體盡少與其他產(chǎn)生瓜葛
依賴者只依賴應該依賴的對象絕對可以減少bug
被依賴者只暴露該暴露的屬性還有方法呢
把風險被降低絕對不可能是假的

試聽請點擊這里

閑來無事聽聽曲,知識已填腦中去浇坐;

學習復習新方式泼掠,頭戴耳機不小覷孕似。

番茄課堂鱼填,學習也要酷橘沥。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市觉渴,隨后出現(xiàn)的幾起案子介劫,更是在濱河造成了極大的恐慌,老刑警劉巖案淋,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件座韵,死亡現(xiàn)場離奇詭異,居然都是意外死亡踢京,警方通過查閱死者的電腦和手機誉碴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓣距,“玉大人黔帕,你說我怎么就攤上這事≈祭裕” “怎么了蹬屹?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵侣背,是天一觀的道長白华。 經(jīng)常有香客問我慨默,道長,這世上最難降的妖魔是什么弧腥? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任厦取,我火速辦了婚禮,結果婚禮上管搪,老公的妹妹穿的比我還像新娘虾攻。我一直安慰自己,他們只是感情好更鲁,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布霎箍。 她就那樣靜靜地躺著,像睡著了一般澡为。 火紅的嫁衣襯著肌膚如雪漂坏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天媒至,我揣著相機與錄音顶别,去河邊找鬼。 笑死拒啰,一個胖子當著我的面吹牛驯绎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谋旦,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼剩失,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了册着?” 一聲冷哼從身側響起拴孤,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎指蚜,沒想到半個月后乞巧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡摊鸡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年绽媒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片免猾。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡是辕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猎提,到底是詐尸還是另有隱情获三,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站疙教,受9級特大地震影響棺聊,放射性物質發(fā)生泄漏。R本人自食惡果不足惜贞谓,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一限佩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裸弦,春花似錦祟同、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至窖贤,卻和暖如春砖顷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背主之。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工择吊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人槽奕。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓几睛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親粤攒。 傳聞我的和親對象是個殘疾皇子所森,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

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