美文网首页
CommandPattern命令模式

CommandPattern命令模式

作者: jeff_chang_liu | 来源:发表于2020-08-17 22:19 被阅读0次

    命令模式

    1.定义

    将一个请求封装成一个对象,从而可以使用不同的请求来参数化客户端。

    命令模式通常有3种角色

    Receiver:接收者角色。负责执行命令的角色

    抽象接收者:具有所有特性的接收者的集合

    public abstract class AbstractReceiver {
    
        public abstract void action();
    }
    

    具体接收者角色:执行不同的业务逻辑

    public class ReceiverOne extends AbstractReceiver {
    
        @Override
        public void action() {
            System.out.println("执行ReceiverOne的业务逻辑");
        }
    }
    
    public class ReceiverTwo extends AbstractReceiver {
    
        @Override
        public void action() {
            System.out.println("执行ReceiverTwo的业务逻辑");
        }
    }
    

    Command:命令角色。需要执行的命令,指定接收者来执行命令

    抽象命令:指定命令接收者,并执行命令

    public abstract class AbstractCommand {
    
        /**
         * 定义一个子类的共享变量(命令接收者)
         */
        protected final AbstractReceiver receiver;
    
        /**
         * 指定命令接收者
         * @param receiver
         */
        public AbstractCommand(AbstractReceiver receiver) {
            this.receiver = receiver;
        }
    
        /**
         * 执行命令
         */
        public abstract void execute();
    }
    

    具体命令:每一个命令是对一个或多个接收者的封装,采用封闭Receiver方式,可以减小上层模块对下层模块的依赖

    public class CommandOne extends AbstractCommand {
    
        /**
         * 指定命令接收者
         * @param receiver
         */
        public CommandOne(AbstractReceiver receiver) {
            super(receiver);
        }
    
        @Override
        public void execute() {
            super.receiver.action();
        }
    }
    
    public class CommandTwo extends AbstractCommand {
    
        /**
         * 指定命令接收者
         * @param receiver
         */
        public CommandTwo(AbstractReceiver receiver) {
            super(receiver);
        }
    
        @Override
        public void execute() {
            super.receiver.action();
        }
    }
    

    Invoker:调用者角色。接收命令并执行

    public class Invoker {
    
        private AbstractCommand command;
    
        /**
         * 接收命令
         * @param command
         */
        public void setCommand(AbstractCommand command) {
            this.command = command;
        }
    
        /**
         * 执行命令
         */
        public void run() {
            this.command.execute();
        }
    }
    

    场景类

    public class Client {
    
        public static void main(String[] args) {
            // 声明调用者
            Invoker invoker = new Invoker();
    
            // 定义一个发送给接收者的命令
            AbstractCommand commandOne = new CommandOne();
            // 调用者执行命令
            invoker.setCommand(commandOne);
            invoker.run();
    
            AbstractReceiver receiver = new ReceiverTwo();
            AbstractCommand commandTwo = new CommandTwo(receiver);
            invoker.setCommand(commandTwo);
            invoker.run();
        }
    }
    

    2.应用

    2.1 优点

    • 解耦:调用者角色与接收者角色没有任何关系。
    • 可扩展性:抽象命令的子类容易扩展,调用者及高层模块不产生严重的代码耦合。

    2.2 缺点

    • 抽象命令的子类过多,会导致命令角色过于膨胀

    2.3 应用场景

    触发-反馈机制的处理

    3.扩展

    撤销命令

    3.1 使用备忘录模式还原状态

    备忘录模式见后续博文

    3.2 新增撤销命令

    修改接收者角色,新增rollBack方法,回滚任务

    public abstract class AbstractReceiver {
    
        public abstract void action();
    
        public abstract void rollBack();
    }
    
    public class ReceiverOne extends AbstractReceiver {
    
        @Override
        public void action() {
            System.out.println("执行ReceiverOne的业务逻辑");
        }
    
        @Override
        public void rollBack() {
            System.out.println("撤销ReceiverOne的action操作");
        }
    }
    

    新增撤销命令

    public class RollBackOneCommand extends AbstractCommand {
    
        /**
         * 指定一个默认命令接收者
         */
        public RollBackOneCommand() {
            super(new ReceiverOne());
        }
    
        /**
         * 指定命令接收者
         * @param receiver
         */
        public RollBackOneCommand(AbstractReceiver receiver) {
            super(receiver);
        }
    
        @Override
        public void execute() {
            super.receiver.rollBack();
        }
    }
    

    相关文章

      网友评论

          本文标题:CommandPattern命令模式

          本文链接:https://www.haomeiwen.com/subject/jqucjktx.html