二嫂的燒烤攤
大家好,我是小趙,現任藏劍山庄高級鑄劍師,在山庄里任職的這段時間,和老王他們幾個成了好朋友,經常一起吹牛逼打飛機。
今天周末,晚上八點左右,我們商量着去老王他二嫂那蹭一頓燒烤吃,老王的二嫂在山楂街通匯橋上擺了個燒烤攤,據說生意還不錯,比我們上班強多了。
“老板娘,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!”