设计模式之命令模式
来源:互联网 发布:淘宝网买东西找人付款 编辑:程序博客网 时间:2024/05/16 07:43
一、定义:将一个请求分装成一个对象,从而让你使用不同的请求吧客户端参数化,对请求排队 或者记录请求日志,可以提供命令的撤销和恢复功能。Encapsulate a request as an object, thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.
这种设计模式主要是将类间的关系解耦,将请求分装成命令类,命令类负责指挥底层类 怎么样去完成一项工作, 而底层类之负责管理好自己负责的工作,而。不用考虑各项工作的关系,甚至和其他类的协作关系,都由命令类控制。最后命令类都交给Invoker类负责统一调用。在最高层模块中,只要负责发布相应命令,交给Invoker去执行即可。
二、简单代码示例
Command command1 = new Command1(new Labour1()); //制定命令; 高层调用Command command2 = new Command1(new Labour2()); Command command3 = new Command2();Invoker invoker=new Invoker();invoker.setCommand(command1);//将命令交给Invoker执行System.out.println("The result of command1 "+invoker.getResult()); invoker.setCommand(command2);System.out.println("The result of command2 "+invoker.getResult()); invoker.setCommand(command3);System.out.println("The result of command3 "+invoker.getResult());
执行结果
I am dig desperatelyThe result of command1 DoneI am planting desperatelyThe result of command2 DoneI am dig desperatelyI am planting desperatelyThe result of command3 Done
命令封装:
public interface Command { //命令接口void exec();}
public class Command1 implements Command { //第一种命令,叫一个劳力去工作private Worker worker;public Command1(Worker worker) {// TODO Auto-generated constructor stubthis.worker = worker;}@Overridepublic void exec() {// TODO Auto-generated method stubworker.work();}}
public class Command2 implements Command { //第二种命令 叫两个劳力协同工作private Worker worker1 = new Labour1();private Worker worker2 = new Labour2();@Overridepublic void exec() { //先叫挖土的去挖土,再叫种树的去种树// TODO Auto-generated method stubworker1.work();worker2.work();}}
工作类:
public interface Worker { //工作类 只负责做好自己的工作,其他什么都不管void work();}
public class Labour1 implements Worker {public void done() {System.out.println("done");}@Overridepublic void work() { //我只管挖土// TODO Auto-generated method stubSystem.out.println("I am dig desperately");}}
public class Labour2 implements Worker {@Overridepublic void work() { //我只管种树// TODO Auto-generated method stubSystem.out.println("I am planting desperately");}}
对于复杂的类间关系来说,这种设计模式,是的类间结构清晰,各类职责明确单一,对于需求的修改,不会影响高层调用,只要修改相应分装的命令类即可。如:现在我要加一个填土的工人。public class Labour3 implements Worker {@Overridepublic void work() {// TODO Auto-generated method stubSystem.out.println("I am wrapping desperately");}}
若要三个工人协同完成种树工作,即先挖坑,在种树,最后填土。只要在第二种命令中 修改两行代码即可,与高层调用无关。甚至可以做到文件替换。public class Command2 implements Command {private Worker worker1 = new Labour1();private Worker worker2 = new Labour2();
private Worker worker3= new Labour3();@Overridepublic void exec() {// TODO Auto-generated method stubworker1.work();worker2.work();
worker3.work();}}
但对于类间关系简单的应用,例如你只有一种命令,则用此设计模式显得鸡肋,不如直接写在高层调用中。命令模式对于撤销,重做的响应,只要再分装一条撤销命令即可,然后又底层的类方法中根据日志进行回滚。可以看到命令模式中主要有三种角色,命令发布者,命令执行者和工作人员。发布者发布一条命令给执行者,执行者执行各种命令。所以关键的需求要在命令类中实现,命令类中要能够完成发布者的需求,协调好各个工作人员的工作,而工作人员只负责自己的工作。职责清晰,结构明确。
阅读全文
0 0
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之--命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之--命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之 命令模式
- 7月28日云栖精选夜读:【上报纸啦】95后大学生用机器学习PAI大战老年痴呆
- 基于MQTT实现推送
- ios-矩阵旋转缩放平移操作
- Visual Studio2013常用快捷键大全
- Java有没有多继承
- 设计模式之命令模式
- HTTP 最强资料大全
- 更新package.json中的dependencies依赖到最新版本
- Android内部存储与外部存储解析
- centos修改mysql字符集 解决中文乱码问题
- 关于纯函数#1,#2与@@@的使用
- android本地访问krpano全景注意事项
- 通过Actor模型解决C++ 并发编程的一种思维 — Theron 库简述
- Oracle 外连接和(+)号的用法