设计模式之命令模式

来源:互联网 发布:大工软件学院 编辑:程序博客网 时间:2024/06/05 08:19

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


Command类,用来声明执行操作的接口。

public abstract class Command {    protected Receiver mReceiver;    public Command(Receiver receiver) {        mReceiver = receiver;    }    public abstract void execute();}

ConcreteCommand类,将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现execute。

public class ConcreteCommand extends Command {    public ConcreteCommand(Receiver receiver) {        super(receiver);    }    @Override    public void execute() {        mReceiver.action();    }}

Invoker类,要求该命令执行这个请求。

public class Invoker {    private Command mCommand;    public void setCommand(Command command) {        mCommand = command;    }    public void executeCommand() {        mCommand.execute();    }}

Receiver类,知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。

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

调用,创建一个具体命令对象,并设定它的接收者。

Receiver receiver = new Receiver();ConcreteCommand command = new ConcreteCommand(receiver);Invoker invoker = new Invoker();invoker.setCommand(command);invoker.executeCommand();

命令模式的优点:

第一,它能较容易地设计一个命令队列;

第二,在需要的情况下,可以较容易地将命令记入日志;

第三,允许接收请求的一方决定是否要否决请求;

第四,可以容易地实现对请求的撤销和重做;

第五,由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易;

第六,命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。

敏捷开发原则告诉我们,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不要着急去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。

例子:


抽象命令类:

public abstract class Command {    protected Barbecuer mBarbecuer;    public Command(Barbecuer barbecuer) {        mBarbecuer = barbecuer;    }    public abstract void excuteCommand();}

具体命令类:

public class BakeMuttonCommand extends Command {    public BakeMuttonCommand(Barbecuer barbecuer) {        super(barbecuer);    }    @Override    public void excuteCommand() {        mBarbecuer.bakeMutton();    }}

public class BakeChickenWingCommand extends Command {    public BakeChickenWingCommand(Barbecuer barbecuer) {        super(barbecuer);    }    @Override    public void excuteCommand() {        mBarbecuer.bakeChickenWing();    }}

服务员类:

public class Waiter {    private List<Command> mCommands = new ArrayList<Command>();    public void setCommand(Command command) {        mCommands.add(command);    }    public void cancelCommand(Command command) {        mCommands.remove(command);    }    public void notifyBarbecuer() {        for (Command item : mCommands) {            item.excuteCommand();        }    }}

烤肉串者类:

public class Barbecuer {    public void bakeMutton() {        System.out.println("烤羊肉串");    }    public void bakeChickenWing() {        System.out.println("烤鸡翅");    }}

调用:

Barbecuer barbecuer = new Barbecuer();BakeMuttonCommand muttonCommand = new BakeMuttonCommand(barbecuer);BakeChickenWingCommand wingCommand = new BakeChickenWingCommand(barbecuer);Waiter waiter = new Waiter();waiter.setCommand(muttonCommand);waiter.setCommand(wingCommand);waiter.setCommand(muttonCommand);waiter.cancelCommand(wingCommand);waiter.notifyBarbecuer();

输出结果:

烤羊肉串烤羊肉串

0 0
原创粉丝点击