设计模式-命令模式

来源:互联网 发布:apache 安装 编辑:程序博客网 时间:2024/04/26 20:36
定义:将一个请求封装为一个对象,从而使我们可以用不同的请求对用户进行参数化。其实也是在客户请求与服务器之间加一个中间人的角色,来达到分离耦合目的的模式。在命令模式中,命令对象并不知道如何处理命令,会由相应的接收者对象来真正执行命令。命令模式的本质是:封装请求。主要就是把请求封装成命令对象,然后对此对象进行一系列的处理。命令模式的角色:(1)Command:定义命令接口,声明执行的方法。(2)ConcreteCommand:命令接口实现对象,通常持有请求接收者,并调用接收者的功能来完成命令要执行的操作。(3)Receiver:接受者,真正执行命令的对象,只要能够命令要求实现相应功能的类,都可以作为接收者。(4)Invoker:调用者,使用命令对象的入口,通常持有命令对象,这是客户端真正触发命令并要求命令执行相应操作的地方。(5)Client:创建具体的命令对象,并设置命令对象的接收者,这个客户端非传统意义上的客户端,也可称为装配者,组装命令对象与接收者。
//命令接口,声明要执行的操作    public interface Command{        //执行命令的操作        public void execute();    }    //具体命令对象    public class ConcreteCommand implements Command{        //持有相应的接收者        private Receiver receiver;        //命令对象自己的状态        private String state;        public ConcreteCommand(Receiver receiver){            this.receiver = receiver;        }        @Override        public void execute(){            //通常调用接收者对应的方法,让接收者来真正执行功能            receiver.action();        }    }    //接收者对象    public class Receiver{        //真正执行命令的方法        public void action(){}    }    //调用者,使用命令对象的入口    public class Invoker{        //持有命令对象        private Command command;        public void  setCommand(Command command){            this.command = command;        }        //控制命令对象执行方法        public void runCommand(){            command.execute();        }    }    //装配者类    public class Client{        //负责创建命令,设定他的接收者        public void assemble(){            //创建接收者            Receiver receiver = new Receiver();            Command command = new ConcreteCommand(receiver);            //创建调用者,将命令对象设置进去            Invoker invoker = new Invoker();            invoker.setCommand(command);        }    }
命令模式的关键之处就是把请求封装成对象,也就是命令对象,并定义统一执行操作接口,这个命令对象可以被存储,转发,记录,处理,撤销等,整个命令模式都是对这个对象的操作。命令模式的使用场景:(1)需要抽象出要执行的操作,可使用命令模式。(2)需要在不同的时刻指定,排列和执行请求,可以选用命令模式。可以把请求封装成命令对象,然后实现把请求队列化。(3)支持取消操作,通过命令的管理,很容易实现命令的恢复和重做。(4)如果需要支持系统崩溃时,能把对系统的操作重新执行一遍,可以使用命令模式,记录命令日志,通过日志可将命令重新执行一遍。(5)在需要事物的系统里面,可选用命令模式,命令模式有一个别名transaction。
0 0
原创粉丝点击