命令模式

《大話設(shè)計(jì)模式》閱讀筆記和總結(jié)。原書(shū)是C#編寫的晕拆,本人用Java實(shí)現(xiàn)了一遍,包括每種設(shè)計(jì)模式的UML圖實(shí)現(xiàn)和示例代碼實(shí)現(xiàn)。
目錄:設(shè)計(jì)模式
Github地址:DesignPattern

說(shuō)明

定義:命令模式(Command)柬批,將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象啸澡,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志氮帐,以及支持可撤銷的操作嗅虏。

UML圖:

命令模式UML圖.png

代碼實(shí)現(xiàn):

Command類,用來(lái)聲明執(zhí)行操作的接口

/**
 * Command類上沐,用來(lái)聲明執(zhí)行操作的接口
 */
abstract class Command{
    protected  Receiver receiver;
    public Command(Receiver receiver){
        this.receiver = receiver;
    }

    public abstract void Execute();
}

ConcreteCommand類皮服,將一個(gè)接收者對(duì)象綁定與一個(gè)動(dòng)作,調(diào)用接收者相應(yīng)的操作参咙,以實(shí)現(xiàn)Excute

class ConcreteCommand extends Command{

    public ConcreteCommand(Receiver receiver) {
        super(receiver);
    }

    @Override
    public void Execute() {
        receiver.Action();
    }
}

Invoker類龄广,要求該命令執(zhí)行這個(gè)請(qǐng)求

class Invoker{
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void excuteCommand(){
        command.Execute();
    }
}

Receiver類,知道如何實(shí)施與執(zhí)行一個(gè)與請(qǐng)求相關(guān)的操作蕴侧,任何類都可能作為一個(gè)接收者

class Receiver{
    public void Action(){
        System.out.println("執(zhí)行請(qǐng)求");
    }
}

客戶端代碼

public class CommandPattern {
    public static void main(String[] args){
        Receiver r = new Receiver();
        Command c = new ConcreteCommand(r);
        Invoker i = new Invoker();

        i.setCommand(c);
        i.excuteCommand();
    }
}

運(yùn)行結(jié)果

執(zhí)行請(qǐng)求

示例

例子:夏天我們吃燒烤的時(shí)候都是燒烤店提前準(zhǔn)備好串择同,然后由燒烤師傅來(lái)烤制。我們通過(guò)服務(wù)員點(diǎn)餐戈盈,由服務(wù)員告訴燒烤師傅所點(diǎn)的菜奠衔。我們也可以通過(guò)服務(wù)員知道哪些菜沒(méi)有了。用程序模擬這個(gè)過(guò)程塘娶。

代碼實(shí)現(xiàn):

烤肉串者

public class Barbecuer {

    public void BakeMutton(){
        System.out.println("烤羊肉串");
    }

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

抽象命令類

public abstract class BarbecuerCommand {
    protected Barbecuer receiver;
    public BarbecuerCommand(Barbecuer receiver){
        this.receiver =receiver;
    }

    public abstract void ExcuteCommand();
}

具體命令-烤羊肉串命令

public class BakeMuttonCommand extends BarbecuerCommand {
    public BakeMuttonCommand(Barbecuer receiver) {
        super(receiver);
    }

    @Override
    public void ExcuteCommand() {
        receiver.BakeMutton();
    }
}

具體命令-烤雞翅命令

public class BakeChickenWingCommand extends BarbecuerCommand {
    public BakeChickenWingCommand(Barbecuer receiver) {
        super(receiver);
    }

    @Override
    public void ExcuteCommand() {
        receiver.BakeChickenWing();
    }
}

服務(wù)員類

public class Waiter {
    private List<BarbecuerCommand> orders = new ArrayList<>();

    //設(shè)置訂單
    public void setOrder(BarbecuerCommand command){
        if (command instanceof BakeChickenWingCommand){
            System.out.println("服務(wù)員:雞翅沒(méi)有了归斤,請(qǐng)點(diǎn)其他的");
        }else {
            orders.add(command);
            System.out.println("增加訂單:羊肉串");
        }
    }

    // 取消訂單
    public void cancelOrder(BarbecuerCommand command){
        orders.remove(command);
    }

    // 通知全部執(zhí)行
    public void Notify(){
        for (int i = 0; i < orders.size(); i++) {
            orders.get(i).ExcuteCommand();
        }
    }
}

客戶端代碼

public class Main {
    public static void main(String[] args){
        //開(kāi)店前準(zhǔn)備
        Barbecuer boy = new Barbecuer();
        BarbecuerCommand bakeMuttonCommand1 = new BakeMuttonCommand(boy);
        BarbecuerCommand bakeMuttonCommand2 = new BakeMuttonCommand(boy);
        BarbecuerCommand bakeChickenWingCommand = new BakeChickenWingCommand(boy);
        Waiter girl = new Waiter();

        // 開(kāi)門營(yíng)業(yè)
        girl.setOrder(bakeMuttonCommand1);
        girl.setOrder(bakeMuttonCommand2);
        girl.setOrder(bakeChickenWingCommand);

        // 點(diǎn)菜完畢,通知廚房
        girl.Notify();
    }
}

運(yùn)行結(jié)果

增加訂單:羊肉串
增加訂單:羊肉串
服務(wù)員:雞翅沒(méi)有了刁岸,請(qǐng)點(diǎn)其他的
烤羊肉串
烤羊肉串
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脏里,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子虹曙,更是在濱河造成了極大的恐慌迫横,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酝碳,死亡現(xiàn)場(chǎng)離奇詭異矾踱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)疏哗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門呛讲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人返奉,你說(shuō)我怎么就攤上這事贝搁。” “怎么了芽偏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵雷逆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我污尉,道長(zhǎng)膀哲,這世上最難降的妖魔是什么往产? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮等太,結(jié)果婚禮上捂齐,老公的妹妹穿的比我還像新娘。我一直安慰自己缩抡,他們只是感情好奠宜,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瞻想,像睡著了一般压真。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蘑险,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天滴肿,我揣著相機(jī)與錄音,去河邊找鬼佃迄。 笑死泼差,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呵俏。 我是一名探鬼主播堆缘,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼普碎!你這毒婦竟也來(lái)了吼肥?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤麻车,失蹤者是張志新(化名)和其女友劉穎缀皱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體动猬,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啤斗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赁咙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钮莲。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖序目,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伯襟,我是刑警寧澤猿涨,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站姆怪,受9級(jí)特大地震影響叛赚,放射性物質(zhì)發(fā)生泄漏澡绩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一俺附、第九天 我趴在偏房一處隱蔽的房頂上張望肥卡。 院中可真熱鬧,春花似錦事镣、人聲如沸步鉴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)氛琢。三九已至,卻和暖如春随闪,著一層夾襖步出監(jiān)牢的瞬間阳似,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工铐伴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撮奏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓当宴,卻偏偏與公主長(zhǎng)得像畜吊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子即供,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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