命令模式

二嫂的燒烤攤

  你們好,我是小趙,現任藏劍山莊高級鑄劍師,在山莊裏任職的這段時間,和老王他們幾個成了好朋友,常常一塊兒吹牛逼打飛機。ide

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

 

  「老闆娘,10串牛肉10串羊肉1斤小龍蝦!羊肉不要辣!」this

  「老闆娘,1個雞腿2個雞翅2串羊肉5串金針菇,羊肉不要辣!」spa

  「老闆娘,3串雞胗5串香菇2串羊肉2串雞肉,雞肉不要辣,羊肉微辣!」code

  「老闆娘,10串羊肉2個雞腿3個雞翅,羊肉中辣,其餘微辣!」blog

  ...............rem

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

 

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

 

  我想了想說:「那就寫顧客點餐吧。」List

 

類圖:

我是老闆娘:

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!」

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息