在饭店吃烤串的时候会有这样的场景,服务员在一旁做记录,你在选菜单。然后将菜单交给烤串师傅。如果要修改的话,直接告诉服务员即可。
实现的UML图如下:
具体实现代码如下:
1、Barbecur类
public class Barbecuer
{
public void bakeMutton()
{
System.out.println("烤羊肉");
}
public void bakeChickrenWing()
{
System.out.println("烤鸡翅");
}
}
2、Command类
public abstract class Command
{
protected Barbecuer barbecuer;
public Command(Barbecuer barbecuer)
{
this.barbecuer=barbecuer;
}
abstract public void excuteCommand();
}
3、ConcreteCommand类
public class BakeChickenWingCommand extends Command
{
public BakeChickenWingCommand(Barbecuer barbecuer)
{
super(barbecuer);
// TODO Auto-generated constructor stub
}
@Override
public void excuteCommand()
{
// TODO Auto-generated method stub
barbecuer.bakeChickrenWing();
}
}
class BakeMuttonCommand extends Command
{
public BakeMuttonCommand(Barbecuer barbecuer)
{
super(barbecuer);
// TODO Auto-generated constructor stub
}
@Override
public void excuteCommand()
{
// TODO Auto-generated method stub
barbecuer.bakeMutton();
}
}
4、Waiter类
public class Waiter
{
private List<Command> orders=new ArrayList<Command>();
public void setCommand(Command command)
{
if(command.toString().indexOf("BakeChickenWingCommand")!=-1)
{
System.out.println("烤鸡翅没了,请点别的");
}
else
{
orders.add(command);
System.out.println("增加订单");
}
}
public void cancelCommand(Command command)
{
orders.remove(command);
}
public void notice()
{
for(Command cmd:orders)
{
cmd.excuteCommand();
}
}
}
5、客户端类
public class Client
{
public static void main(String[] args)
{
Barbecuer boy=new Barbecuer();
Command bakeMuttonCommand1=new BakeMuttonCommand(boy);
Command bakeMuttonCommand2=new BakeMuttonCommand(boy);
Command bakeChickenWingCommand=new BakeChickenWingCommand(boy);
Waiter girl=new Waiter();
girl.setCommand(bakeMuttonCommand1);
girl.notice();
girl.setCommand(bakeMuttonCommand2);
girl.notice();
girl.setCommand(bakeChickenWingCommand);
girl.notice();
}
}
命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
1、Reciver类
public class Receiver
{
public void action()
{
System.out.println("do action1");
}
public void action1()
{
System.out.println("do action2");
}
}
2、Command类
public abstract class Command
{
public Receiver receiver;
public Command(Receiver receiver)
{
this.receiver = receiver;
}
public abstract void execute();
}
3、ConcreteCommand类
public class ConcreteCommand1 extends Command
{
public ConcreteCommand1(Receiver receiver)
{
super(receiver);
// TODO Auto-generated constructor stub
}
@Override
public void execute()
{
// TODO Auto-generated method stub
receiver.action();
}
}
class ConcreteCommand2 extends Command
{
public ConcreteCommand2(Receiver receiver)
{
super(receiver);
// TODO Auto-generated constructor stub
}
@Override
public void execute()
{
// TODO Auto-generated method stub
receiver.action1();
}
}
4、Invoker类
public class Invoker
{
private Command command;
public void setCommand(Command command)
{
this.command = command;
}
public void executeCommand(Command command)
{
command.execute();
}
}
5、Client类
public class Client
{
public static void main(String[] args)
{
Receiver receiver = new Receiver();
Invoker invoker = new Invoker();
Command command = new ConcreteCommand1(receiver);
invoker.setCommand(command);
invoker.executeCommand(command);
Command command2 = new ConcreteCommand2(receiver);
invoker.setCommand(command2);
invoker.executeCommand(command2);
}
}
命令模式的作用:
1、易设计一个命令队列
2、易将命令记入日志
3、易实现对命令撤销和重做
4、加入新命令易扩展
文章来源:程杰老师<大话设计模式>