设计模式之命令模式

命令模式(Command) 将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。


示例

需求: 模拟顾客点餐(下命令Command),服务员记录订单(Invoker,要求厨师执行command),并告知厨师订单的类目(Receiver,具体的命令的执行者,任何类都可作为接收者)。


Command,声明执行操作的接口:

  /**
 * 命令对象
 */
public interface Command {

void execute(Cook cook);
}

烤羊肉串的命令:BakeMuttonCommand

public class BakeMuttonCommand implements Command {

@Override
public void execute(Cook cook) {

    cook.BakeMutton();
}
}

烤鸡翅的命令:BakeChickenWingCommand

public class BakeChickenWingCommand implements Command {
@Override
public void execute(Cook cook) {
    cook.BakeChickenWing();
}
}

厨师Cook(Receiver):

/**
 * Receiver, Cook,厨师
 */
public class Cook {

public void BakeMutton() {
System.out.println("厨师烤羊肉串");
}

public void BakeChickenWing() {
System.out.println("厨师烤鸡翅");
}
}

服务员waiter:

/**
 * Invoker,要求命令执行。这是也就是服务员告诉厨师做什么
 */
public class Waiter {

//命令集合
private List<Command> commands;

//receiver
private static final Cook cook;

static {
cook = new Cook();
}

public Waiter() {
commands = new ArrayList<>();
}

//下订单
public void setCommand(Command command) {

if (command instanceof BakeChickenWingCommand) {
System.out.println("顾客下单烤鸡翅...");
} else if (command instanceof BakeMuttonCommand) {
System.out.println("顾客下单烤羊肉串...");
}
commands.add(command);
System.out.println("日志:增加订单:" + command.getClass().getSimpleName() + " 增加时间:" + new Date());
}

//取消订单
public void cancelCommand(Command command) {
commands.remove(command);
System.out.println("日志:取消订单:" + command.getClass().getSimpleName() + " 取消时间:" + new Date());
}

//执行订单
public void notifyCommands() {
for (Command c : commands) {
c.execute(cook);
}
}
}

测试:

   @Test
public void commandTest() {
    //服务员
    Waiter waiter = new Waiter();
    //顾客点单
    Command mutton = new BakeMuttonCommand();
    Command chicken = new BakeChickenWingCommand();
    //服务员记录点单内容并通知厨师执行
    waiter.setCommand(mutton);
    waiter.setCommand(chicken);
    waiter.notifyCommands();

    waiter.cancelCommand(mutton);
    waiter.notifyCommands();
}

测试结果:

    顾客下单烤羊肉串...
    日志:增加订单:BakeMuttonCommand 增加时间:Mon Oct 16 10:39:16 CST 2017
    顾客下单烤鸡翅...
    日志:增加订单:BakeChickenWingCommand 增加时间:Mon Oct 16 10:39:16 CST 2017
    厨师烤羊肉串
    厨师烤鸡翅
    日志:取消订单:BakeMuttonCommand 取消时间:Mon Oct 16 10:39:16 CST 2017
    厨师烤鸡翅

命令模式的作用:

  • 它能比较容易的设计一个命令队列
  • 在需要的情况下,可以容易的将命令记入日志
  • 允许接收请求的一方决定是否要否决请求
  • 容易实现对请求的撤销和重做
  • 新增具体命令类也比较容易

源码地址

本文地址:http://blog.csdn.net/ProdigalWang/article/details/78247650

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值