设计模式--命令模式
来源:互联网 发布:sql数据库服务器搭建 编辑:程序博客网 时间:2024/06/06 05:38
一.定义
命令模式:将一个请求封装为一个命令对象,从而使你可用不同的请求对客户端进行参数化,对请求排队,组合,存储等,以及支持可撤销的操作;一.类结构图
一.举例
场景:模拟开灯,关灯,开,关音响,调音量命令命令接受者:Lignt.java;Stereo.java
public class Light {String loc = "";public Light(String loc) {this.loc = loc;}public void On() {System.out.println(loc + " On");}public void Off() {System.out.println(loc + " Off");}}
public class Stereo {static int volume = 0;public void On() {System.out.println("Stereo On");}public void Off() {System.out.println("Stereo Off");}public void SetCd() {System.out.println("Stereo SetCd");}public void SetVol(int vol) {volume = vol;System.out.println("Stereo volume=" + volume);}public int GetVol() {return volume;}public void Start() {System.out.println("Stereo Start");}}
命令接口:
public interface Command {public void execute();public void undo();}
如下封装命令对象:
public class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light){this.light=light;}@Overridepublic void execute() {// TODO Auto-generated method stublight.Off();}@Overridepublic void undo() {// TODO Auto-generated method stublight.On();}}
public class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light){this.light=light;}@Overridepublic void execute() {// TODO Auto-generated method stublight.On();}@Overridepublic void undo() {// TODO Auto-generated method stublight.Off();}}
public class StereoAddVolCommand implements Command {private Stereo setreo;public StereoAddVolCommand(Stereo setreo){this.setreo=setreo;}@Overridepublic void execute() {// TODO Auto-generated method stubint vol=setreo.GetVol();if(vol<11){setreo.SetVol(++vol);}}@Overridepublic void undo() {// TODO Auto-generated method stubint vol=setreo.GetVol();if(vol>0){setreo.SetVol(--vol);}}.....剩余命令对象略
下面是Invoker对象
public class CommandModeControl implements Control{private Command[] onCommands;private Command[] offCommands;private Stack<Command> stack=new Stack<Command>();public CommandModeControl(){onCommands=new Command[5]; offCommands=new Command[5]; Command noCommand=new NoCommand(); for(int i=0,len=onCommands.length;i<len;i++) { onCommands[i]=noCommand; offCommands[i]=noCommand; } }public void setCommand(int slot,Command onCommand,Command offCommand){onCommands[slot]=onCommand; offCommands[slot]=offCommand;}@Overridepublic void onButton(int slot) {onCommands[slot].execute();stack.push(onCommands[slot]);}@Overridepublic void offButton(int slot) {offCommands[slot].execute();stack.push(offCommands[slot]);}@Overridepublic void undoButton() {// TODO Auto-generated method stubstack.pop().undo();}
Client 客户端
public static void main(String[] args) {CommandModeControl control = new CommandModeControl();MarcoCommand onmarco,offmarco;Light bedroomlight = new Light("BedRoom");Light kitchlight = new Light("Kitch");Stereo stereo = new Stereo();LightOnCommand bedroomlighton = new LightOnCommand(bedroomlight);LightOffCommand bedroomlightoff = new LightOffCommand(bedroomlight);LightOnCommand kitchlighton = new LightOnCommand(kitchlight);LightOffCommand kitchlightoff = new LightOffCommand(kitchlight); Command[] oncommands={bedroomlighton,kitchlighton}; Command[] offcommands={bedroomlightoff,kitchlightoff};onmarco=new MarcoCommand(oncommands);offmarco=new MarcoCommand(offcommands);StereoOnCommand stereoOn = new StereoOnCommand(stereo);StereoOffCommand stereoOff = new StereoOffCommand(stereo);StereoAddVolCommand stereoaddvol = new StereoAddVolCommand(stereo);StereoSubVolCommand stereosubvol = new StereoSubVolCommand(stereo);control.setCommand(0, bedroomlighton, bedroomlightoff);control.setCommand(1, kitchlighton, kitchlightoff);control.setCommand(2, stereoOn, stereoOff);control.setCommand(3, stereoaddvol, stereosubvol);control.setCommand(4, onmarco, offmarco);control.onButton(0);control.undoButton();//control.offButton(0);control.onButton(1);control.offButton(1);control.onButton(2);control.onButton(3);control.offButton(3);control.undoButton();control.offButton(2);control.undoButton();control.onButton(4);control.offButton(4);}
命令模式的优势:
命令对象的本质你将命令封装成对象,将发出命令和执行命令的责任分开;这带来的好处有:我们可以对命令进行组合,设计成一个队列;对命令进行存储,放入一个栈结构中,这样就支持回退操作,还可以将命令记录日志;可以很容易的加入新的命令而不影响其他的类。
0 0
- 设计模式---命令模式
- 设计模式-命令模式
- 设计模式:命令模式
- 设计模式:命令模式
- 设计模式:命令模式
- 设计模式 命令模式
- 设计模式--命令模式
- 设计模式---命令模式
- 设计模式- 命令模式
- 设计模式---命令模式
- 设计模式 - 命令模式
- 【设计模式】【命令模式】
- 设计模式---命令模式
- 设计模式 - 命令模式
- 设计模式:命令模式
- 设计模式 - 命令模式
- 设计模式-命令模式
- 设计模式---命令模式
- CompletableFuture执行线程的一次研究
- shell 30分钟删除文件demo
- oracle11g OCP 认证 1Z0-052考试笔记3
- Eclipse - changing font size in project/package explorer
- CSS中first-child和nth-child的讲解
- 设计模式--命令模式
- Windows同时使用Python 2.7和Python 3.5以及pip
- java中使用反射获取对象的属性和属性值
- J2SE第四章——异常(二)
- Apache tags-tiles翻译
- HDU1004
- 元素和鼠标事件的距离属性
- Mac环境下svn的使用
- websocket+php实现前后端实时通信