ü 核心:將一個請求封裝爲一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤銷的操作;
ü 優點:1、他能夠容易地設計一個命令隊列;2、在需要的情況下,可以較容易地將命令計入日誌;3、允許接收請求的一方決定是否要否決請求;4、可以容易地實現對請求的撤銷和重做;5、由於加進新的具體命令類不影響其他的類,因此增加新的具體命令類很容易;6、(最關鍵的)將請求一個操作的對象與知道怎麼執行一個操作的對象分隔開;
ü 結構圖:
實例:燒烤店經營方式的模擬
Ø 燒烤員Baker類 – 文件Baker.java
package com.yilong.designpattern.command.bake;
public class Baker {
public void bakeMutton(int amount) {
for(int i=0; i<amount; i++) {
System.out.println("烤羊肉串!");
}
}
public void bakeChickenWing(int amount) {
for(int i=0; i<amount; i++) {
System.out.println("烤雞翅!");
}
}
}
Ø 命令的抽象類 – 文件Command.java
package com.yilong.designpattern.command.bake;
public abstract class Command {
Baker baker;
int amount;
public Command(Baker baker) {
this.baker = baker;
}
public void setAmount(int amount) {
this.amount = amount;
}
public abstract void displayCommand();
public abstract void execute();
}
Ø 烤羊肉串的命令類 – 文件BakeMuttonCommand.java
package com.yilong.designpattern.command.bake;
public class BakeMuttonCommand extends Command {
public BakeMuttonCommand(Baker baker) {
super(baker);
}
@Override
public void execute() {
this.baker.bakeMutton(this.amount);
}
@Override
public void displayCommand() {
System.out.println("烤羊肉串!份數:" + this.amount);
}
}
Ø 烤雞翅的命令類 – 文件BakeChickenCommand.java
package com.yilong.designpattern.command.bake;
public class BakeChickenWingCommand extends Command {
public BakeChickenWingCommand(Baker baker) {
super(baker);
}
@Override
public void execute() {
this.baker.bakeChickenWing(this.amount);
}
@Override
public void displayCommand() {
System.out.println("烤雞翅!份數:" + this.amount);
}
}
Ø 服務員類 – 文件Waiter.java
package com.yilong.designpattern.command.bake;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Waiter {
List<Command> commands = new ArrayList<Command>();
public void setOrder(Command command) {
int orderNum = commands.size() + 1;
System.out.print("訂單" + orderNum + ": ");
command.displayCommand();
commands.add(command);
}
public void giveOrder() {
Iterator commandIterator = commands.iterator();
while(commandIterator.hasNext()) {
Command c = (Command)commandIterator.next();
c.execute();
}
commands.removeAll(commands);
}
}
Ø 測試類 – Client.java
package com.yilong.designpattern.command.bake;
public class Client {
public static void main(String[] args) {
System.out.println("----- 營業前的準備 -----");
System.out.println("1、指定廚師!");
Baker baker = new Baker();
Command command1 = new BakeMuttonCommand(baker);
Command command2 = new BakeChickenWingCommand(baker);
System.out.println("2、指定服務員!");
Waiter waiter = new Waiter();
System.out.println("----- 開門營業 -----");
System.out.println("1、接待客人!");
System.out.println("2、服務員寫訂單 -----");
command1.setAmount(5);
command2.setAmount(3);
waiter.setOrder(command1);
waiter.setOrder(command2);
System.out.println("----- 廚師工作中 -----");
waiter.giveOrder();
}
}
打印結果:
----- 營業前的準備 -----
1、指定廚師!
2、指定服務員!
----- 開門營業 -----
1、接待客人!
2、服務員寫訂單 -----
訂單1: 烤羊肉串!份數:5
訂單2: 烤雞翅!份數:3
----- 廚師工作中 -----
烤羊肉串!
烤羊肉串!
烤羊肉串!
烤羊肉串!
烤羊肉串!
烤雞翅!
烤雞翅!
烤雞翅!