設(shè)計(jì)模式之命令模式(行為型)--- 15

  • 一、導(dǎo)語(yǔ)
  • 二、怎么用
    1.樣例背景
    2.UML類(lèi)圖
    3.代碼示例
  • 三、優(yōu)缺點(diǎn)
  • 四、使用場(chǎng)景
    1.概括描述
    2.現(xiàn)存知名產(chǎn)品中的使用示例
  • 五、相關(guān)設(shè)計(jì)模式
  • 六、參考

一、導(dǎo)語(yǔ)

命令模式(Command),將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,以便使用不同的請(qǐng)求。

命令模式解決了應(yīng)用程序中對(duì)象的職責(zé)以及他們之間的通信方式。

命令模式的優(yōu)點(diǎn)及使用原則

二、怎么用

共有2個(gè)示例,代碼詳見(jiàn)訪問(wèn)鏈接
下面以example2舉例說(shuō)明

1. 樣例背景

模擬顧客去燒烤店吃燒烤的例子

2. UML類(lèi)圖

ACommand ---------------------------------- 抽象的命令類(lèi)
BakeChickenWingCommand ------------------ 實(shí)際烤雞翅的命令類(lèi)
BakeMuttonCommand ------------------------ 實(shí)際烤羊肉串的命令類(lèi)
Barbecuer ------------------------------------ 燒烤命令的直接執(zhí)行者
Waiter ---------------------------------------- 點(diǎn)菜的服務(wù)員

example2 使用命令模式后 UML類(lèi)圖

3. 代碼示例

/**
 * description:  命令模式的抽象類(lèi)
 */
public abstract class ACommand {
    protected Barbecuer barbecuer;

    public ACommand(Barbecuer barbecuer) {
        this.barbecuer = barbecuer;
    }

    abstract void executeCommand();
}


/**
 * description:  烤雞翅的具體命令
 */
public class BakeChickenWingCommand extends ACommand {
    public BakeChickenWingCommand(Barbecuer barbecuer) {
        super(barbecuer);
    }

    @Override
    void executeCommand() {
        barbecuer.bakeChickenWing();
    }
}


/**
 * description:  具體的烤羊肉串的類(lèi)
 */
public class BakeMuttonCommand extends ACommand {
    public BakeMuttonCommand(Barbecuer barbecuer) {
        super(barbecuer);
    }

    @Override
    void executeCommand() {
        barbecuer.bakeMutton();
    }
}


/**
 * description:  燒烤師傅
 */
public class Barbecuer {
    public void bakeMutton(){
        System.out.println("烤羊肉串");
    }

    public void bakeChickenWing(){
        System.out.println("烤雞翅");
    }
}


/**
 * description:  服務(wù)員類(lèi)
 */
public class Waiter {
    private List<ACommand> commandList = new ArrayList<>();

    public void setOrder(ACommand command) {
        commandList.add(command);
    }

    public void cancelOrder(ACommand command) {
        commandList.remove(command);
    }

    public void executeAllCommand() {
        for (ACommand command : commandList) {
            command.executeCommand();
        }
        commandList.clear();
    }
}


public class Test {
    public static void main(String[] args) {
        Barbecuer barbecuer = new Barbecuer();
        ACommand bakeMuttonCommand1 = new BakeMuttonCommand(barbecuer);
        ACommand bakeMuttonCommand2 = new BakeMuttonCommand(barbecuer);
        ACommand bakeChickenWingCommand = new BakeChickenWingCommand(barbecuer);

        Waiter girl = new Waiter();
        girl.setOrder(bakeMuttonCommand1);
        girl.setOrder(bakeMuttonCommand2);
        girl.setOrder(bakeChickenWingCommand);

        girl.executeAllCommand();
    }
}

執(zhí)行結(jié)果

烤羊肉串
烤羊肉串
烤雞翅

三、優(yōu)缺點(diǎn)

  • 缺點(diǎn)
    1.命令的無(wú)限擴(kuò)展會(huì)增加類(lèi)的數(shù)量,提高系統(tǒng)實(shí)現(xiàn)復(fù)雜度

  • 優(yōu)點(diǎn)
    1.降低耦合
    2.容易擴(kuò)展新命令或者一組命令

四、使用場(chǎng)景

1. 概括描述

  • 請(qǐng)求的調(diào)用者和請(qǐng)求的接收者需要解耦,使調(diào)用者和接收者不直接交互
  • 需要抽象出等待執(zhí)行的行為

2. 現(xiàn)存知名產(chǎn)品中的使用示例 todo

2.1 Runnable (jdk)

2.2 junit.framework.Test (junit)

五、與其他設(shè)計(jì)模式的對(duì)比

1. 命令模式和備忘錄模式

他們兩個(gè)經(jīng)常會(huì)結(jié)合起來(lái)使用,我們可以使用備忘錄模式來(lái)保存命令的歷史記錄,
那這樣的話就可以調(diào)取上一個(gè)命令,或者上上個(gè)命令,這些都是ok的。

六、參考

  1. https://coding.imooc.com/learn/list/270.html(強(qiáng)烈推薦)
  2. https://en.wikipedia.org/wiki/Design_Patterns
  3. 大話設(shè)計(jì)模式,電子版下載鏈接,https://pan.baidu.com/s/17WOI3Bvp-JUoQXvaomHISg 密碼:vw05
    (作者博客,https://www.cnblogs.com/cj723/archive/2007/12/30/1021314.html)
  4. https://www.cnblogs.com/geek6/p/3951677.html
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 12,394評(píng)論 6 13
  • 【學(xué)習(xí)難度:★★★☆☆,使用頻率:★★★★☆】直接出處:命令模式梳理和學(xué)習(xí):https://github.com/...
    BruceOuyang閱讀 926評(píng)論 0 3
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,652評(píng)論 1 32
  • 晨光微醺樓宇間, 紅日初現(xiàn)霞滿天, 前路漸明步漸寬, 春枝福葉共風(fēng)展。
    陳光彬閱讀 109評(píng)論 2 1
  • 幸福一點(diǎn)都不簡(jiǎn)單!36歲的自己總感覺(jué)時(shí)間過(guò)得太快。兩地分居的生活我也不知道自己什么時(shí)候會(huì)堅(jiān)持不下去,如果真的分離,...
    吉祥如意_ad66閱讀 145評(píng)論 0 1

友情鏈接更多精彩內(nèi)容