您的位置:首页 > 其它

设计模式 – 命令模式(Command)

2010-10-02 22:16 351 查看
ü 核心:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作;
ü 优点: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
----- 厨师工作中 -----
烤羊肉串!
烤羊肉串!
烤羊肉串!
烤羊肉串!
烤羊肉串!
烤鸡翅!
烤鸡翅!
烤鸡翅!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: