命令模式(行为类)
来源:互联网 发布:linux系统切换用户 编辑:程序博客网 时间:2024/06/13 09:20
UML
- receiver角色: 该角色是干活的角色,命令传递到这里是应该被执行的
- Command角色: 需要执行的命令都需要在这里执行
- Invoker角色: 接收到命令,并执行命令
介绍
- 意图: 将一个请求封装为一个命令,从而使得不同的请求对客户参数化
- 优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
- 缺点: 使用命令模式可能会导致某些系统有过多的具体命令类。
- 用途: 模拟CMD
例子
UML
介绍
遥控器控制灯,立体声等的亮,暗
代码
Control
public 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"); }}
参考
<<设计模式之禅>>
极客学院教学视频
0 0
- 命令模式(行为类)
- 设计模式--命令模式(行为类模式)
- 行为模式-命令模式
- 行为模式-命令模式
- 命令模式 - 行为模式
- 行为型模式-命令
- 行为型--命令模式
- 命令模式(行为型)
- 命令模式(行为变化)
- 设计模式-行为-命令
- 行为型模式----命令模式
- 命令模式-对象行为模式
- 行为模式之命令模式
- 行为型模式-命令模式
- 行为模式之命令模式
- 行为型模式--命令模式
- 行为类模式—命令模式(10)
- 行为型之命令模式
- 【伪】第一次在Xcode中安装CocoaPods并,安装第三方框架AFNetWorking!
- 作用域public,protected,private,以及不写时的区别?
- 2016秋季美团面经_后台研发
- linux常用命令——install
- sdk 更新地址
- 命令模式(行为类)
- matlab之将视频逐帧保存为图片
- 欢迎使用CSDN-markdown编辑器
- 世界正进入一个混乱时代:深不见底的社会断层、全球化的终结
- 银联支付文档
- ThinkPad 触控板双指不可以滑动
- JavaBean
- 小坑记录
- 反射专题3