设计模式之命令模式
2016-05-04 20:54
351 查看
命令模式定义:是一个高内聚的模式,将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复操作工作。
优点:
1、类间解耦。
调用者角色与接受者角色(light)之间没有依赖,调用者只需要调用Command的exec方法,不需要知道是那一个接受者执行的。
2、可扩展性。
3、可以和其他模式结合使用。
结合责任链,实现命令族解析任务。
结合模版方法模式,可以减少Command子类的膨胀问题。
缺点:
那就是类膨胀问题。
类图如下:
代码实现如下:
light类:
Command抽象类:
LightOnCommand类:
LightOffCommand类:
NoCommand类:
控制类:
测试类:
在上面的代码中通过添加undo方法,实现了撤销上一步操作。
这就是命令模式。
参考资料:
1、设计模式之禅
2、Head First 设计模式
备注:
转载请注明出处
http://blog.csdn.net/wsyw126/article/details/51317887
by WSYW126
优点:
1、类间解耦。
调用者角色与接受者角色(light)之间没有依赖,调用者只需要调用Command的exec方法,不需要知道是那一个接受者执行的。
2、可扩展性。
3、可以和其他模式结合使用。
结合责任链,实现命令族解析任务。
结合模版方法模式,可以减少Command子类的膨胀问题。
缺点:
那就是类膨胀问题。
类图如下:
代码实现如下:
light类:
package com.designpatterns.command; public class Light { public void on() { System.out.println("Light is on"); } public void off() { System.out.println("Light is off"); } }
Command抽象类:
package com.designpatterns.command; public interface Command { public Light light = new Light(); public void execute(); public void undo(); }
LightOnCommand类:
package com.designpatterns.command; public class LightOnCommand implements Command { @Override public void execute() { light.on(); } @Override public void undo() { light.off(); } }
LightOffCommand类:
package com.designpatterns.command; public class LightOffCommand implements Command { @Override public void execute() { light.off(); } @Override public void undo() { light.on(); } }
NoCommand类:
package com.designpatterns.command; public class NoCommand implements Command { @Override public void execute() { } @Override public void undo() { } }
控制类:
package com.designpatterns.command; public class SimepleRemoteControl { private Command[] onComands; private Command[] offComands; private Command undoCommand; public SimepleRemoteControl() { onComands = new Command[7]; offComands = new Command[7]; Command noCommand = new NoCommand(); for (int i = 0; i < 7; i++) { onComands[i] = noCommand; offComands[i] = noCommand; } undoCommand = noCommand; } public void setCommand(int slot, Command onCommand, Command offCommand) { onComands[slot] = onCommand; offComands[slot] = offCommand; } public void onButtonWasPressed(int slot) { onComands[slot].execute(); undoCommand=onComands[slot]; } public void offButtonWasPressed(int slot) { offComands[slot].execute(); undoCommand=offComands[slot]; } public void undoButtonWasPushed(){ undoCommand.undo(); } }
测试类:
package com.designpatterns.command; public class Main { public static void main(String[] args) { SimepleRemoteControl simepleRemoteControl = new SimepleRemoteControl(); LightOnCommand lightOnCommand = new LightOnCommand(); LightOffCommand lightOffCommand = new LightOffCommand(); simepleRemoteControl.setCommand(0, lightOnCommand, lightOffCommand); System.out.println("开灯!"); simepleRemoteControl.onButtonWasPressed(0); System.out.println("关灯!"); simepleRemoteControl.offButtonWasPressed(0); System.out.println("撤销上一步操作!"); simepleRemoteControl.undoButtonWasPushed(); } }
在上面的代码中通过添加undo方法,实现了撤销上一步操作。
这就是命令模式。
参考资料:
1、设计模式之禅
2、Head First 设计模式
备注:
转载请注明出处
http://blog.csdn.net/wsyw126/article/details/51317887
by WSYW126
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用