一、以烤羊肉串为例:
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();
}
}