定义:
命令模式:将一个请求封装为一个对象,从而使你可用冉的请求对客户进行参数化;对请求排队或记录请求日志,以及支持课撤销的操作。
UML:
命令模式涉及到五个角色,它们分别是:
客户端(Client)角色:创建一个具体命令(ConcreteCommand)对象并确定其接收者。
命令(Command)角色:声明了一个给所有具体命令类的抽象接口。
具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
优点:
它能较容易地设计一个命令队列
在需要的情况下,可用容易的将命令记入日志
允许接受请求的一方决定是否否决请求
可用容易的实现对请求的撤销和重做
由于加进的具体命令类不影响其他的类,因此增加新的具体命令类很容易
命令模式把请求一个操作的对象与指导怎么执行一个操作的对象分隔开
实例:
主要实现功能:客户打算要点两次烤羊肉,一次烤鸡肉。
package com.zcr.Command;
//烧烤人员
public class Barbecuer
{
//烤羊肉
public void BakeMutton()
{
System.out.println("烤羊肉!!");
}
//烤鸡翅
public void BakeChickenWing()
{
System.out.println("烤鸡翅!!");
}
}
抽象命令类
package com.zcr.Command;
public abstract class Command
{
protected Barbecuer receiver;
public Command()
{
}
public Command(Barbecuer barbecuer)
{
this.receiver = barbecuer;
}
//执行命令
abstract public void ExcuteCommand();
}
具体命令类
package com.zcr.Command;
//烤鸡翅命令
public class BakeChickenWingCommand extends Command
{
public BakeChickenWingCommand(Barbecuer barbecuer)
{
//receiver 来自父类
receiver = barbecuer;
}
@Override
public void ExcuteCommand()
{
receiver.BakeChickenWing();
}
}
具体命令类
package com.zcr.Command;
//烤羊肉命令
public class BakeMuttonCommand extends Command
{
public BakeMuttonCommand(Barbecuer barbecuer)
{
//receiver 来自父类
receiver = barbecuer;
}
@Override
public void ExcuteCommand()
{
receiver.BakeMutton();
}
}
服务员类
package com.zcr.Command;
public class Waiter
{
private Command command;
//设置订单
public void SetOrder(Command command)
{
this.command = command;
}
//通知执行
public void Notify()
{
command.ExcuteCommand();
}
}
package com.zcr.Command;
public class TestCommand
{
public static void main(String[] args)
{
//开店前准备,烧烤店实现就找好了烤肉厨师,服务员和烤肉菜单没等客户上门
Barbecuer boy = new Barbecuer();
Command bakeMuttonCommand1 = new BakeMuttonCommand(boy);
Command bakeMuttonCommand2 = new BakeMuttonCommand(boy);
Command bakeChiCommand = new BakeChickenWingCommand(boy);
Waiter girl = new Waiter();
//开门营业,
girl.SetOrder(bakeMuttonCommand1);
girl.Notify();
girl.SetOrder(bakeMuttonCommand2);
girl.Notify();
girl.SetOrder(bakeChiCommand);
girl.Notify();
}
}