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