zoukankan      html  css  js  c++  java
  • 命令模式


    命令模式


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

      • Receiver接收者角色,主要负责具体命令的执行
      • Command命令角色,需要执行的所有命令的声明
      • Invoker调用者角色,接收到命令,并执行命令。

    命令模式将请求方(Invoker)和执行方(Receiver)区分开了,扩展性也有很好的保障,其通用代码如下:

    public class Invoker {
        //执行的命令
        private Command command;
        public Invoker(Command command){
            this.command = command;
        }
        public void execute(){
            this.command.excute();
        }
    }
    
    public abstract class Command {
        //抽象的执行方法
        public abstract void excute();
    }
    
    public class ConcreteCommand1 extends Command{
        //具体的命令的接收者
        private Receiver receiver;
        public ConcreteCommand1(){
            this.receiver = new Receiver1();
        }
        public ConcreteCommand1(Receiver receiver){
            this.receiver = receiver;
        }
        @Override
        public void excute() {
            // TODO Auto-generated method stub
            this.receiver.doSomething();
        }
    }
    
    public abstract class Receiver {
        //执行者的抽象执行方法
        public abstract void doSomething();
    }
    
    public class Receiver1 extends Receiver{
        @Override
        public void doSomething() {
            // TODO Auto-generated method stub
            System.out.println("receiver1 do something");
        }
    }
    
    public class Client {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Command command = new ConcreteCommand1();
            Invoker invoker = new Invoker(command);
            invoker.execute();
        }
    }
    • 命令模式的优点
      • 类间解耦,调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能只需要调用Command命令的execute()方法,不需要了解具体的Receiver是谁。
      • 可扩展性好,Command的子类可以非常容易地扩展,而调用者Invoker和高层的模块Client不产生严重的代码耦合。
      • 命令模式结合其他模式会更加优秀,命令模式结合责任链模式,实现命令族解析任务,结合模板方法模式,可以减少Command子类的膨胀问题。
  • 相关阅读:
    Python生成验证码
    Django设置
    OpenStack安装后检查流程总结
    利用src.rpm包修改源码后重新制作rpm包
    Python知识点:distutils常用子模块
    libvirt, libvirt-python, libvirtd 关系浅析
    Python知识点: os.popen
    Python知识点: __import__
    修改initrd.img里ko文件的一个小tips
    关于openstack自动化安装的一点思考
  • 原文地址:https://www.cnblogs.com/zhanglei93/p/6068554.html
Copyright © 2011-2022 走看看