美文网首页
命令模式

命令模式

作者: wxz1997 | 来源:发表于2018-09-15 20:56 被阅读0次

    一、定义

    命令模式是一个高内聚的模式,它将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
    优点:

    1. 类间解耦:调用者角色与接收角色之间没有任何依赖关系。
    2. 可扩展性
    3. 可结合其他设计模式解决更多题:结合责任链模式,实现命令解析任务;结合模板方法模式,则以减少Command子类的膨胀问题。

    二、实现

    1. 基础实现
    /**
     * @Description: 命令模式
     * @Author: wxz1997
     * @Date 18-9-15下午8:21
     */
    public class Client {
        public static void main(String[] args) {
            //首先声明调用者Invoker
            Invoker invoker = new Invoker();
            //定义接收者
            Receiver receiver = new ConcreteReciver1();
            //定义一个发送给接收者的命令
            Command command = new ConcreteCommand1(receiver);
            //把命令交给调用者去执行
            invoker.setCommand(command);
            invoker.action();
        }
    }
    
    class Invoker {
        private Command command;
        //受气包,接受命令
    
        public void setCommand(Command command) {
            this.command = command;
        }
        //执行命令
    
        public void action() {
            this.command.execute();
        }
    }
    
    abstract class Command {
        //每个命令类都必须有一个执行命令的方法
        public abstract void execute();
    }
    
    class ConcreteCommand1 extends Command {
        //对哪个Receiver类进行命令处理
        private Receiver receiver;
        //构造函数传递接收者
        public ConcreteCommand1(Receiver receiver){
            this.receiver = receiver;
        }
        //必须实现一个命令
        public void execute() {
            //业务处理
            this.receiver.doSomething();
        }
    }
    
    abstract class Receiver {
        //抽象接收者,定义每个接收者都必须完成的业务
        public abstract void doSomething();
    }
    
    class ConcreteReciver1 extends Receiver{
        //每个接收者都必须处理一定的业务逻辑
        public void doSomething(){
        }
    }
    
    1. 最佳实践
    /**
     * @Description: 命令模式(高层次的模块不需要知道接收者)
     * @Author: wxz1997
     * @Date 18-9-15下午8:21
     */
    public class Client {
        public static void main(String[] args) {
            //首先声明调用者Invoker
            Invoker invoker = new Invoker();
            //定义一个发送给接收者的命令
            Command command = new ConcreteCommand1();
            //把命令交给调用者去执行
            invoker.setCommand(command);
            invoker.action();
        }
    }
    
    class Invoker {
        private Command command;
        //受气包,接受命令
    
        public void setCommand(Command command) {
            this.command = command;
        }
        //执行命令
    
        public void action() {
            this.command.execute();
        }
    }
    
    /**
     * Command设置了默认的接受者,使得高层的模块并不需要知道是有具体的哪个接受者执行
     */
    abstract class Command {
        //定义一个子类的全局共享变量
        protected final Receiver receiver;
        //实现类必须定义一个接收者
        public Command(Receiver receiver){
            this.receiver = receiver;
        }
        //每个命令类都必须有一个执行命令的方法
        public abstract void execute();
    }
    
    class ConcreteCommand1 extends Command {
        //声明自己的默认接收者
        public ConcreteCommand1(){
            super(new ConcreteReciver1());
        }
        //设置新的接收者
        public ConcreteCommand1(Receiver receiver){
            super(receiver);
        }
        //每个具体的命令都必须实现一个命令
        public void execute() {
            //业务处理
            super.receiver.doSomething();
        }
    }
    
    abstract class Receiver {
        //抽象接收者,定义每个接收者都必须完成的业务
        public abstract void doSomething();
    }
    
    class ConcreteReciver1 extends Receiver{
        //每个接收者都必须处理一定的业务逻辑
        public void doSomething(){
        }
    }
    

    相关文章

      网友评论

          本文标题:命令模式

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