设计模式——命令模式
Posted shenqiaqia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式——命令模式相关的知识,希望对你有一定的参考价值。
这次来看下命令模式:
先看下head first中对命令模式的定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
接下来,再来看下类图:
最后来看下代码:
public interface Command void execute(); void undo();
public class LightOffCommand implements Command private Light light = new Light(); public LightOffCommand() this.light = light; @Override public void execute() light.off(); @Override public void undo() light.on();
public class LightOnCommand implements Command private Light light = new Light(); public LightOnCommand() this.light = light; @Override public void execute() light.on(); @Override public void undo() light.off();
public class Light public void on() System.out.println("Light is on"); public void off() System.out.println("Light is off");
public class NoCommand implements Command @Override public void execute() @Override public void undo()
public class StereoOffWithCDCommand implements Command private Stereo stereo = new Stereo(); public StereoOffWithCDCommand() this.stereo = stereo; @Override public void execute() stereo.off(); @Override public void undo() stereo.on(); stereo.setCD(); stereo.setVolume(11);
public class StereoOnWithCDCommand implements Command private Stereo stereo = new Stereo(); public StereoOnWithCDCommand() this.stereo = stereo; @Override public void execute() stereo.on(); stereo.setCD(); stereo.setVolume(11); @Override public void undo() stereo.off();
public class Stereo public void on() System.out.println("Stereo is on"); public void setCD() System.out.println("CD is set"); public void setVolume(int volume) System.out.println("Volume is set " + volume); public void off() System.out.println("Stereo is off");
public class RemoteControl private Command[] onCommands; private Command[] offCommands; private Command undoCommand; public RemoteControl() onCommands = new Command[2]; offCommands = new Command[2]; Command command = new NoCommand(); for (int i = 0; i < 2; i++) onCommands[i] = command; offCommands[i] = command; undoCommand = command; public void setCommand(int slot, Command onCommand, Command offCommand) onCommands[slot] = onCommand; offCommands[slot] = offCommand; public void onButtonWasPush(int slot) onCommands[slot].execute(); undoCommand = onCommands[slot]; public void offButtonWasPush(int slot) offCommands[slot].execute(); undoCommand = offCommands[slot]; public void undoButtonWasPushed() undoCommand.undo(); @Override public String toString() StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("\\n------ Remote Control ------\\n"); for (int i = 0; i < onCommands.length; i++) stringBuffer.append("[slot " + i + "] " + onCommands[i].getClass().getName() + " " + offCommands[i].getClass().getName() + "\\n"); return stringBuffer.toString();
public class RemoteControlTest public static void main(String[] args) RemoteControl remte = new RemoteControl(); LightOnCommand lightOnCommand = new LightOnCommand(); LightOffCommand lightOffCommand = new LightOffCommand(); StereoOnWithCDCommand onWithCDCommand = new StereoOnWithCDCommand(); StereoOffWithCDCommand offWithCDCommand = new StereoOffWithCDCommand(); remte.setCommand(0, lightOnCommand, lightOffCommand); remte.setCommand(1, onWithCDCommand, offWithCDCommand); System.out.println(remte.toString()); remte.onButtonWasPush(0); remte.onButtonWasPush(1); remte.offButtonWasPush(0); remte.offButtonWasPush(1); remte.undoButtonWasPushed();
以上是关于设计模式——命令模式的主要内容,如果未能解决你的问题,请参考以下文章
是否有在单个活动中处理多个片段的 Android 设计模式?
csharp C#代码片段 - 使类成为Singleton模式。 (C#4.0+)https://heiswayi.github.io/2016/simple-singleton-pattern-us