命令模式


二嫂的燒烤攤

  大家好,我是小趙,現任藏劍山庄高級鑄劍師,在山庄里任職的這段時間,和老王他們幾個成了好朋友,經常一起吹牛逼打飛機。

  今天周末,晚上八點左右,我們商量着去老王他二嫂那蹭一頓燒烤吃,老王的二嫂在山楂街通匯橋上擺了個燒烤攤,據說生意還不錯,比我們上班強多了。

 

  “老板娘,10串牛肉10串羊肉1斤小龍蝦!羊肉不要辣!”

  “老板娘,1個雞腿2個雞翅2串羊肉5串金針菇,羊肉不要辣!”

  “老板娘,3串雞胗5串香菇2串羊肉2串雞肉,雞肉不要辣,羊肉微辣!”

  “老板娘,10串羊肉2個雞腿3個雞翅,羊肉中辣,其他微辣!”

  ...............

  場面一度火爆,露天的小桌子都坐滿了客人,點餐的點餐,催餐的催餐,老王二嫂一個人又負責點餐還負責烤菜,忙的天昏地暗。

 

  “老趙,來幾段代碼玩玩。” 老王邊嗑瓜子邊說,老王就是這樣,對我一本正經寫的程序不感冒,反倒喜歡即興表演,把眼前看到的事情用代碼的方式寫下來很有興趣。

 

  我想了想說:“那就寫顧客點餐吧。”

 

類圖:

我是老板娘:

public class Boss {
    public void orderMutton(){
        System.out.println("烤一份羊肉");
    }

    public void orderChicken(){
        System.out.println("烤一份雞肉");
    }

    public void orderBeef(){
        System.out.println("烤一份牛肉");
    }
}

 

主函數:

    public static void main(String[] args) {
        User zhangsan = new User();
        zhangsan.orderBeef();
        zhangsan.orderChicken();
        zhangsan.orderMutton();
    }

 

輸出:

烤一份牛肉
烤一份雞肉
烤一份羊肉

 

  “好了,寫完了,大家看看,有什么問題?”。

  “調用一個類的方法,這能看出個毛線?” 老王碎了一口瓜子皮。

  “小王!過來幫忙!” 還沒等我發作,老王二嫂的聲音就朝這邊喊了過來,估計那邊實在是忙不過來了。

  這不,老王嗑着瓜子屁顛屁顛的過去幫忙了。

 

老王的幫忙

  有了老王的幫忙,二嫂頓時輕松了許多,只管烤菜,點餐的任務就交給老王了。

 

  只見老王跑來跑去四處招呼,時不時的朝二嫂那邊大喊:

  “002桌一份牛肉!”

  “005桌一份雞肉!”

  “005桌一份羊肉!”

  “006桌一份羊肉!”

  ..........

  老王完全對接了顧客和二嫂,成為了業務請求者和業務實現者的中間人,而顧客只需要對老王發送命令。

 

我想着想着,畫下了流程圖:

 

  由於每一個菜品都是一個命令,所以命令應該是抽象出來,並且所有菜品的最終命令都是由老王傳達給二嫂執行,所以命令都有一個通知執行操作。

那么我們的類圖就可以這么畫:

  類圖畫好后,程序也就呼之欲出了:

我就是老王,我是調用者:

public class Invoker {
    private Command command;

    //記錄命令
    public void setCommand(Command command){
        this.command = command;
    }

    //將命令發送給二嫂執行
    public void action(){
        this.command.execute();
    }
}

 

命令抽象:

public abstract class Command {
    protected Receiver receiver = new Receiver();
    public abstract void execute();//執行命令
}

 

羊肉:

public class CommandMutton extends Command {
    @Override
    public void execute() {
        super.receiver.mutton();
    }
}

 

雞肉:

public class CommandChicken extends Command {
    @Override
    public void execute() {
        super.receiver.chicken();
    }
}

 

牛肉:

public class CommandBeef extends Command {
    @Override
    public void execute() {
        super.receiver.beef();
    }
}

 

我是老板娘,是命令的接收者:

public class Receiver {
    
    public void mutton(){
        System.out.println("烤一份羊肉");
    }
    
    public void chicken(){
        System.out.println("烤一份雞肉");
    }
    
    public void beef(){
        System.out.println("烤一份牛肉");
    }
}

 

客戶端:

    public static void main(String[] args) {
        Invoker wang = new Invoker();
        Command mutton = new CommandMutton();
        wang.setCommand(mutton);
        wang.action();
    }

 

輸出:

烤一份羊肉

 

最后的干杯

  老王忙完后我們擺了一桌胡吃海喝。

  老劉把我的程序拿出來吹噓說牛的一逼,結果老王一看,崩了兩個字:“扯淡!”。

 

  “我說老趙,你這寫的啥玩意兒?點一份菜我就要通知一下二嫂?我嗓子還不喊啞了嗎?”

  這一問,我就陷入了沉默。

 

短暫的思索后,我改了一下Invoker類:

public class Invoker {
    private List<Command> list = new ArrayList<>();

    //記錄命令
    public void setCommand(Command command){
        this.list.add(command);
    }

    //撤銷命令
    public void removeCommand(Command command){
        this.list.remove(command);
    }

    //將命令發送給二嫂執行
    public void action(){
        for(Command command : list){
            command.execute();
        }
    }
}

 

客戶端:

    public static void main(String[] args) {
        Invoker wang = new Invoker();
        Command mutton = new CommandMutton();
        Command mutton2 = new CommandChicken();
        wang.setCommand(mutton);
        wang.setCommand(mutton2);
        wang.action();
    }

 

輸出:

烤一份羊肉
烤一份雞肉

 

老王一看,舉起酒杯一飲而盡,贊嘆道:“Perfect!”

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM