命令模式(行为类)
2016-12-05 16:34
113 查看
UML
receiver角色: 该角色是干活的角色,命令传递到这里是应该被执行的
Command角色: 需要执行的命令都需要在这里执行
Invoker角色: 接收到命令,并执行命令
介绍
意图: 将一个请求封装为一个命令,从而使得不同的请求对客户参数化优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
缺点: 使用命令模式可能会导致某些系统有过多的具体命令类。
用途: 模拟CMD
例子
UML
介绍
遥控器控制灯,立体声等的亮,暗代码
Controlpublic interface Control { public void onButton(int slot); public void offButton(int slot); public void undoButton(); }
Command(Command)
public interface Command { public void execute(); public void undo(); }
CommandModeControl (Invoker)
import java.util.Stack; import com.java.jikexueyuan.commandmode.Control; import com.java.jikexueyuan.commandmode.device.Light; import com.java.jikexueyuan.commandmode.device.Stereo; 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; } @Override public void onButton(int slot) { onCommands[slot].execute(); stack.push(onCommands[slot]); } @Override public void offButton(int slot) { offCommands[slot].execute(); stack.push(offCommands[slot]); } @Override public void undoButton() { // TODO Auto-generated method stub stack.pop().undo(); } }
LightOnCommand (ConcreteCommand)
import com.java.jikexueyuan.commandmode.device.Light; public class LightOnCommand implements Command { private Light light; public LightOnCommand(Light light) { this.light=light; } @Override public void execute() { // TODO Auto-generated method stub light.On(); } @Override public void undo() { // TODO Auto-generated method stub light.Off(); } }
LightOffCommand (ConcreteCommand)
public class LightOffCommand implements Command { private Light light; public LightOffCommand(Light light) { this.light=light; } @Override public void execute() { // TODO Auto-generated method stub light.Off(); } @Override public void undo() { // TODO Auto-generated method stub light.On(); } }
StereoAddVolCommand(ConcreteCommand)
public class StereoAddVolCommand implements Command { private Stereo setreo; public StereoAddVolCommand(Stereo setreo) { this.setreo=setreo; } @Override public void execute() { // TODO Auto-generated method stub int vol= setreo.GetVol(); if(vol<11) { setreo.SetVol(++vol); } } @Override public void undo() { // TODO Auto-generated method stub int vol= setreo.GetVol(); if(vol>0) { setreo.SetVol(--vol); } } }
StereoOffCommand(ConcreteCommand)
public class StereoOffCommand implements Command { private Stereo setreo; public StereoOffCommand(Stereo setreo) { this.setreo=setreo; } @Override public void execute() { // TODO Auto-generated method stub setreo.Off(); } @Override public void undo() { // TODO Auto-generated method stub setreo.On(); setreo.SetCd(); } }
StereoOnCommand(ConcreteCommand)
public class StereoOnCommand implements Command { private Stereo setreo; public StereoOnCommand(Stereo setreo) { this.setreo=setreo; } @Override public void execute() { // TODO Auto-generated method stub setreo.On(); setreo.SetCd(); } @Override public void undo() { // TODO Auto-generated method stub setreo.Off(); } }
StereoSubVolCommand(ConcreteCommand)
public class StereoSubVolCommand implements Command { private Stereo setreo; public StereoSubVolCommand(Stereo setreo) { this.setreo=setreo; } @Override public void execute() { // TODO Auto-generated method stub int vol= setreo.GetVol(); if(vol>0) { setreo.SetVol(--vol); } } @Override public void undo() { // TODO Auto-generated method stub int vol= setreo.GetVol(); if(vol<11) { setreo.SetVol(++vol); } } }
MarcoCommand(ConceteCommand)
public class MarcoCommand implements Command { private Command[] commands; public MarcoCommand(Command[] commands) { this.commands = commands; } @Override public void execute() { // TODO Auto-generated method stub for (int i = 0, len = commands.length; i < len; i++) { commands[i].execute(); } } @Override public void undo() { // TODO Auto-generated method stub for (int i = commands.length - 1; i >= 0; i--) { commands[i].undo(); } } }
NoCommand(ConcreteCommand)
public class NoCommand implements Command { @Override public void execute() { // TODO Auto-generated method stub } @Override public void undo() { // TODO Auto-generated method stub } }
Light(receiver)
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"); } }
Stereo(receiver)
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"); } }
参考
<<设计模式之禅>>极客学院教学视频
相关文章推荐
- 行为模式-命令模式
- 行为模式之命令模式(Command Pattern)C++实现
- 行为设计模式---命令模式(Command)
- JavaScript设计模式--行为类型--命令模式
- 行为类模式—命令模式(10)
- 用命令模式实现限制用户角色的行为
- 【设计模式】行为模式之Command命令
- 设计模式之行为模式-命令,迭代器,中介者,观察者,模板方法
- 命令模式-对象行为模式
- 设计模式---行为类型---命令
- java 命令模式 "处理行为" 经典范例
- 在VB6中用命令行为模式控制GUI动作
- 行为模式:Command(命令)
- 《JAVA与模式》之命令模式(行为)
- 行为模式---之--命令模式
- MVVM设计模式之旅 – 通用的命令附加行为
- 命令模式——行为设计模式之二
- 行为模式-命令模式
- 【设计模式学习笔记十五】【行为模式】【命令模式(Command)】
- Java 设计模式之命令模式的详解(行为模式)