您的位置:首页 > 其它

命令模式(行为类)

2016-12-05 16:34 113 查看

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");
}
}


参考

<<设计模式之禅>>

极客学院教学视频
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: