成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

嘻哈說(shuō):設(shè)計(jì)模式之單一職責(zé)原則

Leo_chen / 1152人閱讀

摘要:定義首先呢,我們來(lái)看一下單一職責(zé)原則的定義。只負(fù)責(zé)一項(xiàng)職責(zé),這就是單一職責(zé)原則。這時(shí)候就涉及到平衡的問(wèn)題,平衡單一職責(zé)原則與修改造成的開(kāi)銷(xiāo)。嘻哈說(shuō)接下來(lái),請(qǐng)您欣賞單一職責(zé)原則的原創(chuàng)歌曲。

1、定義

首先呢,我們來(lái)看一下單一職責(zé)原則的定義。

就一個(gè)類(lèi)而言,應(yīng)該只有一個(gè)引起它變化的原因

這個(gè)說(shuō)法不是很好懂,有一些抽象,不過(guò)呢,我們依舊可以嘗試著理解一下。

就一個(gè)類(lèi)而言,只有一個(gè)引起它變化的原因,也就是說(shuō),除此之外,不能有其它引起變化的原因。

這樣就需要一個(gè)前提,這個(gè)類(lèi)只能負(fù)責(zé)一項(xiàng)職責(zé),而不能負(fù)責(zé)其他的職責(zé),不然,其他的職責(zé)就會(huì)存在其他變化的原因了。

通俗的說(shuō),即一個(gè)類(lèi)只負(fù)責(zé)一項(xiàng)職責(zé)。

懶人就比較喜歡這種通俗地定義,一目了然。

懶人曾經(jīng)總結(jié)過(guò):通俗的定義,淺顯易懂;理論的定義,大腦一懵。

有同感的小伙伴請(qǐng)雙擊666。

2、場(chǎng)景

餐館聚餐,通過(guò)服務(wù)員點(diǎn)餐

這是一個(gè)比較常見(jiàn)的場(chǎng)景,比如懶人擼了五天的代碼,身心疲憊,周末的時(shí)候呢,就約上三五個(gè)好友,去餐館(番茄餐廳)happy一下(非常單純的吃飯)。我們剛剛坐下,就來(lái)了一位很漂亮的服務(wù)員為我們點(diǎn)餐。

這樣一個(gè)服務(wù)員為我們點(diǎn)餐的場(chǎng)景,一般都是什么樣的流程?

第一步:客人點(diǎn)餐

懶人:咱呢,不但要吃飽,還要吃好!服務(wù)員,先來(lái)一份西紅柿炒雞蛋,再來(lái)一份酸辣土豆絲?。?!

好友:臉呢。。。說(shuō)好的臉呢。。。

服務(wù)員:你是顧客,你是上帝,你說(shuō)啥就是啥,不過(guò),你剛才說(shuō)的是啥。。。

第二步:烹飪美食

西紅柿炒雞蛋,先炒雞蛋,再炒西紅柿。。。ok,出鍋。

第三步:上餐

服務(wù)員:這是您點(diǎn)的西紅柿炒雞蛋,請(qǐng)您慢用。

3、實(shí)現(xiàn)

不廢話(huà),擼代碼。

package com.fanqiekt.principle.single;

/**
* 服務(wù)員
* @Author: 番茄課堂-懶人
*/
public class Waiter {

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

        System.out.println("開(kāi)始烹飪:" + dishName);
        //菜品不同,做法不同。
        switch (dishName){
            case "西紅柿炒雞蛋":
                System.out.println("先炒雞蛋");
                System.out.println("再炒西紅柿");
                System.out.println("...");
                break;
            case "酸辣土豆絲":
                System.out.println("先放蔥姜蒜");
                System.out.println("再放土豆絲");
                System.out.println("...");
            break;
        }
        System.out.println(dishName + "出鍋");

        System.out.println(dishName + "上桌啦,請(qǐng)您品嘗");
    }
}

服務(wù)員這個(gè)類(lèi)比較簡(jiǎn)單,就一個(gè)下單的方法。

為了更好的理解,懶人進(jìn)行了細(xì)節(jié)的優(yōu)化(主要是很多細(xì)節(jié)懶人壓根不了解)。

package com.fanqiekt.principle.single;

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

客戶(hù)端這個(gè)類(lèi)就相當(dāng)于客人,客人負(fù)責(zé)通過(guò)服務(wù)員點(diǎn)餐。

客人一共點(diǎn)了兩道大餐,西紅柿炒雞蛋、酸辣土豆絲,我們來(lái)運(yùn)行一下,看看結(jié)果。

客人點(diǎn)餐:西紅柿炒雞蛋
開(kāi)始烹飪:西紅柿炒雞蛋
先炒雞蛋
再炒西紅柿
...
西紅柿炒雞蛋出鍋
西紅柿炒雞蛋上桌啦,請(qǐng)您品嘗
-------
客人點(diǎn)餐:酸辣土豆絲
開(kāi)始烹飪:酸辣土豆絲
先放蔥姜蒜
再放土豆絲
...
酸辣土豆絲出鍋
酸辣土豆絲上桌啦,請(qǐng)您品嘗

OK,兩個(gè)熱氣騰騰的飯菜就做好了。

我們回過(guò)頭來(lái)看一下waiter類(lèi),大家覺(jué)得這個(gè)類(lèi)好不好?

肯定是不好了,那...不好在哪里?

這就好比一個(gè)小作坊,老板既負(fù)責(zé)點(diǎn)餐又負(fù)責(zé)下單,就跟waiter類(lèi)一樣。

我們一般在小作坊吃飯,感受會(huì)怎么樣?

亂,非同一般的雜亂。上菜需要等半天,點(diǎn)餐的時(shí)候找不到人。

還有一個(gè)弊端,我修改了做飯的流程,會(huì)影響下單的業(yè)務(wù),增加修改的風(fēng)險(xiǎn),為什么這么說(shuō)呢?

客人A:老板,給我來(lái)一份酸辣土豆絲。

老板:好嘞,您稍等。

懶人:老板,我剛才點(diǎn)的西紅柿雞蛋要少放鹽啊。

老板:好的,我放鹽的時(shí)候用小點(diǎn)的勺子。

客人A:老板,我的菜做了嗎?我的同伴都吃完了,沒(méi)做我就不要了!

老板:您的菜已經(jīng)做了,馬上就要出鍋了。(內(nèi)心:我勒個(gè)去,剛才用小勺放鹽的時(shí)候把這哥們點(diǎn)的單給忘了,這就尷尬了。。。)

不難看出,當(dāng)功能冗雜到一個(gè)對(duì)象中,這樣修改就會(huì)增加風(fēng)險(xiǎn)。那我們?cè)撊绾伪苊饽兀?/p>

一般比較完善的餐館,還至少會(huì)有一名廚師。

廚師做飯,服務(wù)員點(diǎn)餐,這樣做,有什么好處呢?

一來(lái),結(jié)構(gòu)清晰了,各司其職,一目了然。二來(lái),風(fēng)險(xiǎn)降低了,我修改做飯的流程,不會(huì)影響下單的業(yè)務(wù)。

只負(fù)責(zé)一項(xiàng)職責(zé),這就是單一職責(zé)原則。

那我們嘗試著增加一個(gè)廚師類(lèi)。

package com.fanqiekt.principle.single;

/**
 * 廚師
 *
 * @author 番茄課堂-懶人
 */
public class Chef {

    /**
     * 做飯
     * @param dishName 下單的菜名
     */
    public void cooking(String dishName) {
        System.out.println("開(kāi)始烹飪:"+dishName);
        switch (dishName){
            case "西紅柿炒雞蛋":
                System.out.println("先炒雞蛋");
                System.out.println("再炒西紅柿");
                System.out.println("...");
                break;
            case "酸辣土豆絲":
                System.out.println("先放蔥姜蒜");
                System.out.println("再放土豆絲");
                System.out.println("...");
                break;
        }
        System.out.println(dishName + "出鍋");
    }
}

廚師類(lèi),只負(fù)責(zé)了一項(xiàng)職責(zé):做飯。

這就是類(lèi)的單一職責(zé)原則。

Chef類(lèi)只有一個(gè)cooking方法,cooking方法是根據(jù)下單的菜品名稱(chēng)去烹飪不同的菜,以及炒西紅柿雞蛋以及酸辣土豆絲的具體烹飪過(guò)程。這樣做合適嗎?

不合適的,cooking方法應(yīng)該只有菜品分發(fā)這一項(xiàng)職責(zé),而炒西紅柿雞蛋以及酸辣土豆絲這兩件事顯然易見(jiàn)與分發(fā)沒(méi)有任何關(guān)系,所以拆分出來(lái)效果會(huì)更好。

我們將廚師類(lèi)再優(yōu)化下。

package com.fanqiekt.principle.single;

/**
 * 廚師
 *
 * @author 番茄課堂-懶人
 */
public class Chef {

    /**
     * 做飯
     * 方法的單一職責(zé)原則
     * @param dishName 下單的菜名
     */
    public void cooking(String dishName) {
        System.out.println("開(kāi)始烹飪:"+dishName);

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

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

    /**
     * 炒西紅柿雞蛋
     */
    private void cookingTomato() {
        System.out.println("先炒雞蛋");
        System.out.println("再炒西紅柿");
        System.out.println("...");
    }

    /**
     * 炒酸辣土豆絲
     */
    private void cookingPotato() {
        System.out.println("先放蔥姜蒜");
        System.out.println("再放土豆絲");
        System.out.println("...");
    }
}

優(yōu)化后Chef類(lèi)有三個(gè)方法。

cooking方法是根據(jù)下單的菜品名稱(chēng)去烹飪不同的菜。

cookingTomato方法是炒西紅柿雞蛋。

cookingPotato方法是炒酸辣土豆絲。

每個(gè)方法只負(fù)責(zé)一項(xiàng)職責(zé),這就是方法的單一職責(zé)原則。

遵守方法單一職責(zé)原則的類(lèi),是不是更加的直觀?修改各自的方法是不是也沒(méi)有影響到其他的方法?

接下來(lái),我們?cè)賰?yōu)化下Waiter類(lèi),讓他遵循類(lèi)的單一職責(zé)原則。

package com.fanqiekt.principle.single;

/**
 * 單一職責(zé)原則的服務(wù)員
 *
 * @author 番茄課堂-懶人
 */
public class Waiter {
    private Chef chef = new Chef();

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

        chef.cooking(dishName);

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

優(yōu)化后SingleWaiter類(lèi)有只負(fù)責(zé)點(diǎn)餐、上餐這些與服務(wù)員相關(guān)的職責(zé),而做飯的這些無(wú)關(guān)的職責(zé)則交給了Chef。

遵守類(lèi)單一職責(zé)原則的項(xiàng)目,是不是更加的直觀?修改各自的類(lèi)是不是也沒(méi)有影響到其他的類(lèi)?

接下來(lái),我們把Client運(yùn)行一下。

客人點(diǎn)餐:西紅柿炒雞蛋
開(kāi)始烹飪:西紅柿炒雞蛋
先炒雞蛋
再炒西紅柿
...
西紅柿炒雞蛋出鍋
西紅柿炒雞蛋上桌啦,請(qǐng)您品嘗
-------
客人點(diǎn)餐:酸辣土豆絲
開(kāi)始烹飪:酸辣土豆絲
先放蔥姜蒜
再放土豆絲
...
酸辣土豆絲出鍋
酸辣土豆絲上桌啦,請(qǐng)您品嘗

結(jié)果與原來(lái)一致。

4、優(yōu)點(diǎn)

擼過(guò)代碼后,我們發(fā)現(xiàn)單一職責(zé)原則的幾個(gè)優(yōu)點(diǎn)。

提高類(lèi)的可讀性

符合單一職責(zé)原則的方法、類(lèi),結(jié)構(gòu)會(huì)更加的清晰,類(lèi)的可讀性也就提高了。

降低類(lèi)的復(fù)雜性
一個(gè)類(lèi)只負(fù)責(zé)一項(xiàng)職責(zé),一個(gè)方法也只負(fù)責(zé)一項(xiàng)職責(zé)??隙ㄒ裙δ苋唠s到一個(gè)方法,一個(gè)類(lèi)中要簡(jiǎn)單得多。

降低風(fēng)險(xiǎn)

修改其中的一個(gè)業(yè)務(wù),不會(huì)影響到業(yè)務(wù)。

5、總結(jié)

我們必須要意識(shí)到,一味的遵守單一職責(zé)原則,不停的分拆類(lèi)所付出的開(kāi)銷(xiāo)是很大的。

這時(shí)候就涉及到平衡的問(wèn)題,平衡單一職責(zé)原則與修改造成的開(kāi)銷(xiāo)。

懶人的觀點(diǎn)是如果一個(gè)方法邏輯不復(fù)雜的情況下,可以修改方法實(shí)現(xiàn),否則要拆分為兩個(gè)方法,遵循方法級(jí)別的單一職責(zé)原則。

如果一個(gè)類(lèi)方法不多的情況下,可以只增加方法,而不用分拆為多個(gè)類(lèi),否則要拆分為多個(gè)類(lèi),遵循類(lèi)級(jí)別的單一職責(zé)原則。

6、嘻哈說(shuō)

接下來(lái),請(qǐng)您欣賞單一職責(zé)原則的原創(chuàng)歌曲。

嘻哈說(shuō):?jiǎn)我宦氊?zé)原則
作曲:懶人
作詞:懶人
Rapper:懶人

周末約上了好友去熟悉的餐館聚餐
只負(fù)責(zé)點(diǎn)餐的漂亮服務(wù)員保持笑容已經(jīng)成為習(xí)慣
只負(fù)責(zé)做飯的帥氣廚師一直待在了煙霧彌漫了幾遍的廚房里面
每個(gè)人有自己負(fù)責(zé)的地盤(pán)
就像單一職責(zé)
一個(gè)類(lèi)只有一個(gè)職責(zé) 好體面
它降低了類(lèi)的復(fù)雜性
它提高了類(lèi)的可讀性
那風(fēng)險(xiǎn)被降低代表著單一職責(zé)沒(méi)毛病

試聽(tīng)請(qǐng)點(diǎn)擊這里

閑來(lái)無(wú)事聽(tīng)聽(tīng)曲,知識(shí)已填腦中去;

學(xué)習(xí)復(fù)習(xí)新方式,頭戴耳機(jī)不小覷。

番茄課堂,學(xué)習(xí)也要酷。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77274.html

相關(guān)文章

  • 單一職責(zé)原則模式的黃金法則

    摘要:今天說(shuō)一下,單一職責(zé)原則。比如,接口的地址本來(lái)已經(jīng)很完美了,但是你的是處女座最討厭處女座非要給路由添加幾個(gè)以保證后臺(tái)數(shù)據(jù)的安全。為了過(guò)年,我會(huì)選擇使用,因?yàn)椴恢捞幣院髸?huì)做出什么傻事來(lái)。此時(shí)的使用動(dòng)態(tài)織入后,可以完美的解決處女座。 在設(shè)計(jì)模式中,有著幾條視為黃金原則,設(shè)計(jì)模式都是圍繞黃金原則,對(duì)代碼或者說(shuō)是架構(gòu)設(shè)計(jì)做出一些相應(yīng)的調(diào)整,久而久之,GoF 4人組,發(fā)現(xiàn)其實(shí)有些設(shè)計(jì)思想可...

    GeekQiaQia 評(píng)論0 收藏0
  • 深入理解JavaScript系列6:S.O.L.I.D五大原則單一職責(zé)

    摘要:,開(kāi)始我們的第一篇單一職責(zé)。通過(guò)解耦可以讓每個(gè)職責(zé)工更加有彈性地變化。關(guān)于本文本文轉(zhuǎn)自大叔的深入理解系列。深入理解系列文章,包括了原創(chuàng),翻譯,轉(zhuǎn)載,整理等各類(lèi)型文章,原文是大叔的一個(gè)非常不錯(cuò)的專(zhuān)題,現(xiàn)將其重新整理發(fā)布。 前言 Bob大叔提出并發(fā)揚(yáng)了S.O.L.I.D五大原則,用來(lái)更好地進(jìn)行面向?qū)ο缶幊?,五大原則分別是: The Single Responsibility Princi...

    walterrwu 評(píng)論0 收藏0
  • 初探面向?qū)ο缶幊?em>之oop與設(shè)計(jì)模式

    摘要:為什么要采用面向?qū)ο缶幊探鉀Q問(wèn)題更容易設(shè)計(jì)計(jì)算機(jī)程序就是為了解決人類(lèi)的問(wèn)題。面向?qū)ο缶幊绦枰獙?duì)業(yè)務(wù)及代碼的架構(gòu)是有一定的要求的。 1. 編程方式 我們目前的編程方式大體可以有以下三種編程方式: 順序編程 過(guò)程式編程 面向?qū)ο缶幊? 在講面向?qū)ο缶幊虝r(shí)先講一下什么是順序編程,什么是過(guò)程式編程,什么是面向?qū)ο缶幊蹋? 順序編程: 就是只用一個(gè)單線程去執(zhí)行一段代碼,執(zhí)行過(guò)程根據(jù)代碼依次從上...

    BingqiChen 評(píng)論0 收藏0
  • JS設(shè)計(jì)模式代理模式

    摘要:什么是代理模式代理模式,類(lèi)似于明星的經(jīng)紀(jì)人,想要拜訪明星,需要先通過(guò)經(jīng)紀(jì)人的溝通。不同于裝飾器,那種動(dòng)態(tài)加載一個(gè)對(duì)象,可以說(shuō)在代理模式當(dāng)中,代理是早已既定的。又稱(chēng)單一功能原則,面向?qū)ο笪鍌€(gè)基本原則之一。 什么是代理模式 代理模式,類(lèi)似于明星的經(jīng)紀(jì)人,想要拜訪明星,需要先通過(guò)經(jīng)紀(jì)人的溝通。而在JS當(dāng)中,如果想訪問(wèn)一個(gè)類(lèi),需要通過(guò)另一個(gè)類(lèi)來(lái)間接訪問(wèn) 。不同于裝飾器,那種動(dòng)態(tài)加載一個(gè)對(duì)象,可...

    widuu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<