博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式学习笔记(19)——命令模式
阅读量:7008 次
发布时间:2019-06-28

本文共 2252 字,大约阅读时间需要 7 分钟。

  hot3.png

一、模式定义

            命令模式将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象,命令模式支持可撤销的操作。

         命令模式可以使发送者和接受者完全解耦,发送者与接收者之间并没有直接的联系,发送者只需要知道如何发送请求,不需要关心请求是如何完成的,这就是命令模式,命令模式将方法调用给封装起来了。

          有点CallBack的意思,主要的三个角色就是“下命令的对象”、“命令对象”、“执行命令的对象”,三者互相解耦,不需要知道彼此具体实现。

二、模式结构

从上图可以看出命令模式包含如下几个角色:

            Command: 抽象命令类

            ConcreteCommand: 具体命令类

            Invoker: 调用者

            Receiver: 接收者

            Client:客户类

         命令模式的本质就在于将命令进行封装,将发出命令的责任和执行命令的责任分开,使得发送者只需要知道如何发送命令即可,不需要知道命令是如何实现的,甚至命令执行是否成功都不需要理会。同时命令模式使得请求也变成了一个对象,它像其他对象一样可以被存储和传递。

三、模式实现

用一个小明让老板加工资的栗子来说明这个模式:

/** * 接收者 */public class Boss {    /**     * 处理"加薪"命令     */    public void addSalary(){        System.out.println("公司董事会商议决定的,让boss给员工加工资.");    }        /**     * 不处理"加薪"命令(取消命令)     */    public void cancelSalary(){        System.out.println("公司董事会经过商讨, 做出如下艰难的决定:暂时不让boss给员工加工资.");    }    }

/** * 规定了用于封装"请求"的方法及撤销命令的方法 */public interface Command {    /**     * 封装"请求"的方法     */    public abstract void execute();        /**     * 撤销"命令"     */    public abstract void undo();}

/** * 具体命令 */public class ConcreteCommand implements Command{    private  Boss receiver;//接收者        public ConcreteCommand(Boss receiver){        this.receiver = receiver;    }        @Override    public void execute() {  //封装"请求"        receiver.addSalary(); //加工资    }    @Override    public void undo() {        receiver.cancelSalary();//取消加工资    }}

/** * 请求者 */public class XiaoMing {    private Command command;    public XiaoMing(Command command) {        this.command = command;    }    /**     * 让具体命令执行execute()方法     */    public void startExecuteCommand() {        command.execute();    }        /**     * 让具体命令执行undo()方法     */    public void undoCommand(){        command.undo();    }    }

/** * 使用命令模式 */public class Application {    public static void main(String[] args) {        //创建接收者        Boss receiver = new Boss();        //创建具体命令并制定接收者        Command command = new ConcreteCommand(receiver);        //创建请求者        XiaoMing invoker = new XiaoMing(command);        invoker.startExecuteCommand();        invoker.undoCommand();    }}

公司董事会商议决定的,让boss给员工加工资.公司董事会经过商讨, 做出如下艰难的决定:暂时不让boss给员工加工资.

四、使用场景        

             1.系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。

        2.系统需要在不同的时间指定请求、将请求排队和执行请求。

        3.系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。

        4.系统需要将一组操作组合在一起,即支持宏命令

转载于:https://my.oschina.net/jewill/blog/418564

你可能感兴趣的文章
通过 pecl 快速安装 php-memcached 扩展
查看>>
Java Quartz的cron表达式
查看>>
Import Running in STMS
查看>>
Silverlight+WCF 新手实例 象棋 主界面-事件区-返回退出(三十三)
查看>>
git克隆失败
查看>>
NFS及RPC讲解
查看>>
tomcat远程调试
查看>>
解决ubuntu12.04无线热点刚建立又断开的问题
查看>>
ROCORE, 生成器,惰性求值,科技进步改变异步编程难题
查看>>
maven常用命令
查看>>
java 线程的几种状态
查看>>
使用smack对tigase进行压力测试
查看>>
fastJson,jackJson,Gson性能比较
查看>>
spring mvc 4 rest 错误:JSPs only permit GET POST or HEAD
查看>>
类似百度地图的 放大缩小功能 的 坐标重定位问题
查看>>
java访问获取web页面信息并记录sessionId
查看>>
机器人网址
查看>>
从一个用户expdp导出再impdp导入到另一个用户
查看>>
揭榜咯~Finereport爱好者论坛征文竞赛第一期获奖名单!!!
查看>>
Java ProcessBuilder类
查看>>