命令模式
2016-01-08 09:34
267 查看
一、命令模式:命令模式将“请求”封装成对象。以便使用不同的请求队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。
(1)命令模式将发出请求的对象和执行请求的对象解耦
(2)在被解耦的两者之间通过命令对象进行沟通的,命令对象接受者和一个或一组动作。
(3)调用者通过调用命令对象的execute()发出请求,这会使得接受者的动作被调用。
(4)调用者可以接受命令当做参数,甚至运行是动态的执行。
二、涉及角色:请求调用者(会传入命令对象,用来发送请求),请求接受者(实际命令执行者),命令接口(所有具体命令实现这个接口),具体命令(将请求的接受者传递给命令对象)。
![](http://images2015.cnblogs.com/blog/733995/201601/733995-20160107101415996-359388697.jpg)
具体实例:
(1) 命令接口
(2) 具体命令
(3) 命令接受者
(4) 命令调用者
(5) 客户端
三、命令撤销
调用Command中undo()方法,即命令对象中除了维持接收者对象的引用,同时记录之前执行的命令。来达到撤销的目的。
四、宏命令
为了一次执行多个命令,可以建立宏命令对象,宏对象中保持了命令的数组,并可以一次执行和撤销相应的命令。
(1)命令模式将发出请求的对象和执行请求的对象解耦
(2)在被解耦的两者之间通过命令对象进行沟通的,命令对象接受者和一个或一组动作。
(3)调用者通过调用命令对象的execute()发出请求,这会使得接受者的动作被调用。
(4)调用者可以接受命令当做参数,甚至运行是动态的执行。
二、涉及角色:请求调用者(会传入命令对象,用来发送请求),请求接受者(实际命令执行者),命令接口(所有具体命令实现这个接口),具体命令(将请求的接受者传递给命令对象)。
![](http://images2015.cnblogs.com/blog/733995/201601/733995-20160107101415996-359388697.jpg)
具体实例:
(1) 命令接口
public interface Command { public void execute(); }
(2) 具体命令
public class LightOnCommand implements Command{ private Light light; public LightOnCommand(Light light){ this.light = light; } @Override public void execute() { light.on(); } }
(3) 命令接受者
public class Light { public void on(){ System.out.println("电灯被打开"); } }
(4) 命令调用者
public class SimpleRemoteControl { private Command slot; public SimpleRemoteControl(){} public void setCommand(Command slot){ this.slot = slot; } public void buttonWasPressed(){ slot.execute(); } }
(5) 客户端
public class SimpleRemoteControl { private Command slot; public SimpleRemoteControl(){} public void setCommand(Command slot){ this.slot = slot; } public void buttonWasPressed(){ slot.execute(); }
三、命令撤销
调用Command中undo()方法,即命令对象中除了维持接收者对象的引用,同时记录之前执行的命令。来达到撤销的目的。
四、宏命令
为了一次执行多个命令,可以建立宏命令对象,宏对象中保持了命令的数组,并可以一次执行和撤销相应的命令。
相关文章推荐
- Eclipse中 搭建 Spring+SpringMVC+Mybatis整合(下)
- 如何有效地描述软件缺陷(Defect)?
- Java用String 截取方式解析xml文件、处理大xml文件
- H264编码 封装成MP4格式 视频流 RTP封包
- springmvc jquery 使用时,format中使用fmt的实现
- iOS屏幕横竖屏旋转相关
- 平安阿里数据库技术交流日总结
- android:NinePatch图片制作
- block语法排序 遍历
- 【代码笔记】点击加号增加书架,点击减号减少书架
- MapReduce job.setNumReduceTasks(0)思考
- HDU 2191 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活(多重背包)
- 墨托卡投影(Mercator projection)
- 【代码笔记】点击加号增加书架,点击减号减少书架
- Gradle的安装和配置
- Eclipse中 搭建 Spring+SpringMVC+Mybatis整合(上)
- 服务器基础知识
- Mac安装cordova
- FTP4j下载带有中文的文件时 出现乱码解决方案
- 详解Python爬虫的基本写法