美文网首页
<<设计模式之禅(第二版)>>——第十五

<<设计模式之禅(第二版)>>——第十五

作者: leiiiooo | 来源:发表于2016-10-16 23:14 被阅读5次
    定义:
    • 将请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
    通用类图:
    命令模式的通用类图
    /*
     * 定义一个抽象的接收类,用来定义执行命令的方法
     * */
    public abstract class Receiver {
      public abstract void doSomething();
    }
    public class ReceiverOne extends Receiver {
    
      @Override
      public void doSomething() {
        // TODO Auto-generated method stub
            
      }
    
    }
    public class ReceiverTwo extends Receiver {
    
      @Override
      public void doSomething() {
        // TODO Auto-generated method stub
    
      }
    
    }
    
    /*
     * 定义抽象的命令类
     * */
    public abstract class Command {
      // 每个命令类都有一个执行命令的方法
      public abstract void execute();
    }
    public class ConcreteCommandOne extends Command {
          private Receiver receiver;
    
      public ConcreteCommandOne(Receiver receiver) {
        // TODO Auto-generated constructor stub
        this.receiver = receiver;
      }
    
      @Override
      public void execute() {
        // TODO Auto-generated method stub
        this.receiver.doSomething();
      } 
    
    }
    public class ConcreteCommandTwo extends Command {
    
      private Receiver receiver;
    
      public ConcreteCommandTwo(Receiver receiver) {
        // TODO Auto-generated constructor stub
        this.receiver = receiver;
      }
    
      @Override
      public void execute() {
        // TODO Auto-generated method stub
        this.receiver.doSomething();
      }
    
    }
    /*
     * 定义执行类,根据不同的command 做出对应的操作
     * */
    public class Invoker {
      private Command command;
    
      public void setCommand(Command command) {
        this.command = command;
      }
    
      // 执行命令
      public void action() {
        this.command.execute();
      }
    }
    public class Client {
      public static void main(String[] args) {
        //实际中receiver不会进行暴露,需要做好必要的封装
        Invoker invoker = new Invoker();
        invoker.setCommand(new ConcreteCommandOne(new ReceiverOne()));
        invoker.action();
      }
    }
    
    优点:
    • 类间解耦:调用者和接收者之间没有任何依赖关系,调用者实现功能只需要调用Command抽象类中的execute方法
    • 可拓展性:Command子类易拓展,调用者Invoker和高层次的模块Client不产生严重的代码耦合
    • 结合其他模式:责任链模式,实现命令族解析任务,结合模板方法模式,可以减少Command子类的膨胀
    缺点:
    • N个命令,Command有N个子类,膨胀严重

    相关文章

      网友评论

          本文标题:<<设计模式之禅(第二版)>>——第十五

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