设计模式(二十四)——命令模式

一、以烤羊肉串为例:
1.紧耦合

class Barbecuer {
	// 烤羊肉
	public void BakeMutton() {
		System.out.println("烤羊肉串!");
	}

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

public class Commands {

	public static void main(String[] args) {

		Barbecuer boy = new Barbecuer();
		boy.BakeMutton();
		boy.BakeMutton();
		boy.BakeMutton();
		boy.BakeChickenWing();
		boy.BakeMutton();
		boy.BakeMutton();
		boy.BakeChickenWing();

	}
}

2、松耦合设计

class Barbecuer {
	// 烤羊肉
	public void BakeMutton() {
		System.out.println("烤羊肉串!");
	}

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

abstract class Command { // 抽象命令
	protected Barbecuer receiver;

	public Command(Barbecuer receiver) {
		this.receiver = receiver;
	}

	abstract public void ExcuteCommand();
}

class BakeMuttonCommand extends Command {// 烤羊肉串命令

	public BakeMuttonCommand(Barbecuer receiver) {
		super(receiver);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void ExcuteCommand() {
		// TODO Auto-generated method stub
		receiver.BakeMutton();
	}

}

class BakeChickenWingCommand extends Command {// 烤鸡翅命令

	public BakeChickenWingCommand(Barbecuer receiver) {
		super(receiver);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void ExcuteCommand() {
		// TODO Auto-generated method stub
		receiver.BakeChickenWing();
	}

}

class Waiter {// 服务员类
	private Command command;

	public void SetOrder(Command command) {// 设置订单
		this.command = command;
	}

	public void Notify() {// 通知执行
		command.ExcuteCommand();
	}
}

public class Commands {

	public static void main(String[] args) {
		// 开店前的准备
		Barbecuer boy = new Barbecuer();
		Command BakeMuttonCommand1 = new BakeMuttonCommand(boy);
		Command BakeMuttonCommand2 = new BakeMuttonCommand(boy);
		Command BakeChickenWingCommand1 = new BakeChickenWingCommand(boy);
		Waiter girl = new Waiter();

		// 开门营业
		girl.SetOrder(BakeMuttonCommand1);
		girl.Notify();
		girl.SetOrder(BakeMuttonCommand2);
		girl.Notify();
		girl.SetOrder(BakeChickenWingCommand1);
		girl.Notify();
	}
}

继续改进:

class Barbecuer {
	// 烤羊肉
	public void BakeMutton() {
		System.out.println("烤羊肉串!");
	}

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

abstract class Command { // 抽象命令
	protected Barbecuer receiver;

	public Command(Barbecuer receiver) {
		this.receiver = receiver;
	}

	abstract public void ExcuteCommand();
}

class BakeMuttonCommand extends Command {// 烤羊肉串命令

	public BakeMuttonCommand(Barbecuer receiver) {
		super(receiver);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void ExcuteCommand() {
		// TODO Auto-generated method stub
		receiver.BakeMutton();
	}

}

class BakeChickenWingCommand extends Command {// 烤鸡翅命令

	public BakeChickenWingCommand(Barbecuer receiver) {
		super(receiver);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void ExcuteCommand() {
		// TODO Auto-generated method stub
		receiver.BakeChickenWing();
	}

}

class Waiter {// 服务员类
	private ArrayList<Command> orders = new ArrayList<Command>();
	Date dt = new Date();

	public void SetOrder(Command command) {// 增加订单
		if (command.toString() == "命令模式.BackCjickenWingCommand") {
			System.out.println("服务员:鸡翅没有了,请点别的烧烤。");
		} else {
			orders.add(command);
			System.out.println("增加订单:" + command.toString() + "时间:" + dt.getTime());
		}
	}

	public void CancelOrder(Command command) {// 取消订单
		if (command.toString() == "命令模式.BackCjickenWingCommand") {
			System.out.println("服务员:鸡翅没有了,请点别的烧烤。");
		} else {
			orders.add(command);
			System.out.println("取消订单:" + command.toString() + "时间:" + dt.getTime());
		}
	}

	public void Notify() {// 通知执行
		for (Command cmd : orders) {
			cmd.ExcuteCommand();
		}
	}
}

public class Commands {

	public static void main(String[] args) {
		// 开店前的准备
		Barbecuer boy = new Barbecuer();
		Command BakeMuttonCommand1 = new BakeMuttonCommand(boy);
		Command BakeMuttonCommand2 = new BakeMuttonCommand(boy);
		Command BakeChickenWingCommand1 = new BakeChickenWingCommand(boy);
		Waiter girl = new Waiter();

		// 开门营业
		girl.SetOrder(BakeMuttonCommand1);
		girl.SetOrder(BakeMuttonCommand2);
		girl.SetOrder(BakeChickenWingCommand1);

		// 点菜完毕,通知厨房
		girl.Notify();
	}
}

二、命令模式
命令模式又称为行动(Action)模式或交易(Transaction)模式。
命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化;对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

abstract class Command {
	protected Receiver receiver;

	public Command(Receiver receiver) {
		this.receiver = receiver;
	}

	abstract public void Execute();
}

class ConcreteCommand extends Command {

	public ConcreteCommand(Receiver receiver) {
		super(receiver);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void Execute() {
		// TODO Auto-generated method stub
		receiver.Action();
	}

}

class Receiver {
	public void Action() {
		System.out.println("执行请求!");
	}
}

class Invoker {
	private Command command;

	public void SetCommand(Command command) {
		this.command = command;
	}

	public void ExecuteCommand() {
		command.Execute();
	}
}

public class Commands {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Receiver r = new Receiver();
		Command c = new ConcreteCommand(r);
		Invoker i = new Invoker();
		i.SetCommand(c);
		i.ExecuteCommand();

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值