设计模式之命令模式

来源:互联网 发布:windows找不到cmd.exe 编辑:程序博客网 时间:2024/06/05 04:28

GOF对命令模式的定义是:将一个请求封装成对象,从而使用户可用不同的请求对客户进行参数化,对请求排队或记录请求日志,并支持可撤销操作。

先看基本代码

//抽象命令public abstract class Command {protected Receiver receiver;public Command(Receiver receiver) {super();this.receiver = receiver;}abstract public void Execute();}
//具体命令public class CommandA extends Command{public CommandA(Receiver receiver) {super(receiver);// TODO Auto-generated constructor stub}@Overridepublic void Execute() {// TODO Auto-generated method stubreceiver.action();}}
/** *  * @author ricardo * @Time 下午10:29:49 * @Function:传递命令 * */public class Invoker {private Command command;public void setCommand(Command command) {this.command = command;}public void ExecuteCommand() {command.Execute();}}
/** *  * @author ricardo * @Time 下午10:27:55 * @Function:命令执行者 * */public class Receiver {public void action() {System.out.println("执行命令");}}
客户端

public class Client {public static void main(String[] args) {Receiver receiver = new Receiver();Command command = new CommandA(receiver);Invoker invoker = new Invoker();invoker.setCommand(command);invoker.ExecuteCommand();}}
运行截图

以军队中军令的传递作Demo演示下命令模式

//士兵public class Soliders {public void combinate() {// TODO Auto-generated method stubSystem.out.println("士兵们列阵");}public void fight() {System.out.println("陷阵之志,有死无生");}public void cableBoat() {System.out.println("结军阵,水淹七军");}}//命令public abstract class Command {protected Soliders soliders;public Command(Soliders soliders) {super();this.soliders = soliders;}public abstract void ExecuteCommand();}//传令官public class Herald {private List<Command> commands = new ArrayList<Command>();public void setCommand(Command command) {commands.add(command);}//战场上真要等传令官攒一堆命令再去执行,大概坟头草丈高了QAQpublic void Notify() {for(int i=0;i<commands.size();i++) {commands.get(i).ExecuteCommand();}}public void CancleCommand(Command command) {commands.remove(command);}}
public class CombinateCommand extends Command {public CombinateCommand(Soliders soliders) {super(soliders);}@Overridepublic void ExecuteCommand() {// TODO Auto-generated method stubsoliders.combinate();}}public class CableBoatCommand extends Command {public CableBoatCommand(Soliders soliders) {super(soliders);}@Overridepublic void ExecuteCommand() {soliders.cableBoat();}}
public class FightCommand extends Command {public FightCommand(Soliders soliders) {super(soliders);}@Overridepublic void ExecuteCommand() {soliders.fight();}}
客户端

public class Client {public static void main(String[] args) {Soliders soliders = new Soliders();Command com = new CombinateCommand(soliders);Command fight = new FightCommand(soliders);Command cable = new CableBoatCommand(soliders);Herald herald = new Herald();herald.setCommand(com);herald.setCommand(fight);herald.setCommand(fight);herald.setCommand(cable);herald.Notify();System.out.println("卧槽,战斗失误了,哎,大兄弟,我悔个棋");herald.CancleCommand(cable);herald.Notify();}}
运行截图




命令模式的优点很明显,首先,命令模式可以很容易的设计一个命令队列,就像对军队的传令官一样,其次,可以方便的完成日志的记录,最后,可以允许接受请求的一方来决定是否否决请求,更可以实现对命令的撤销和重做。

以上内容,整理自刘径舟,张玉华编著的《设计模式其实很简单》读书笔记,欢迎转载





原创粉丝点击