设计模式之命令模式

来源:互联网 发布:php怎么写html 编辑:程序博客网 时间:2024/06/06 08:42

命令模式定义:是一个高内聚的模式,将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复操作工作。

优点:

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 {@Overridepublic void execute() {light.on();}@Overridepublic void undo() {light.off();}}

LightOffCommand类:

package com.designpatterns.command;public class LightOffCommand implements Command {@Overridepublic void execute() {light.off();}@Overridepublic void undo() {light.on();}}

NoCommand类:

package com.designpatterns.command;public class NoCommand implements Command {@Overridepublic void execute() {}@Overridepublic 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

0 0
原创粉丝点击