您的位置:首页 > 其它

设计模式--命令模式

2018-09-09 18:18 169 查看

家电自动化遥控器API项目

传统设计方案

package com.java.jikexueyuan.commandmode.device;
//电灯
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");
}

}
package com.java.jikexueyuan.commandmode.device;
//音响
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");
}
}
package com.java.jikexueyuan.commandmode;
//遥控器
public interface Control {
//开机按钮
public void onButton(int slot);
//关机按钮
public void offButton(int slot);

public void undoButton();
}
package com.java.jikexueyuan.commandmode;

import com.java.jikexueyuan.commandmode.device.Light;
import com.java.jikexueyuan.commandmode.device.Stereo;
//遥控器实现类
public class TraditionControl implements Control {
Light light;
Stereo stereo;

public TraditionControl(Light light, Stereo stereo) {
this.light = light;
this.stereo = stereo;
}

@Override
public void onButton(int slot) {
// TODO Auto-generated method stub
switch (slot) {
case 0:
light.On();
break;
case 1:
stereo.On();
break;
case 2:
int vol = stereo.GetVol();
if (vol < 11) {
stereo.SetVol(++vol);
}
break;
}
}

@Override
public void offButton(int slot) {
// TODO Auto-generated method stub
switch (slot) {
case 0:
light.Off();
break;
case 1:
stereo.Off();
break;
case 2:
int vol = stereo.GetVol();
if (vol > 0) {
stereo.SetVol(--vol);
}
break;
}
}

@Override
public void undoButton() {
// TODO Auto-generated method stub

}

}
package com.java.jikexueyuan.commandmode;

import com.java.jikexueyuan.commandmode.device.Light;
import com.java.jikexueyuan.commandmode.device.Stereo;
//使用遥控器
public class ControlTest {
public static void main(String[] args) {
Control ctl;
Light light = new Light("Bedroom");
Stereo stereo = new Stereo();
ctl = new TraditionControl(light, stereo);

ctl.onButton(0);
ctl.offButton(0);
ctl.onButton(1);
ctl.onButton(2);
ctl.offButton(2);

ctl.offButton(1);
}
}

命令模式:将请求、命令、动作等封装成对象,这样可以让项目使用这些对象来参数化其他对象。使得命令的请求者和执行者解耦

重新设计如下

package com.java.jikexueyuan.commandmode.command;
//所有命令的接口
public interface Command {
public void execute();
public void undo();
}
package com.java.jikexueyuan.commandmode.command;

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

}
package com.java.jikexueyuan.commandmode.command;

import com.java.jikexueyuan.commandmode.device.Light;
//关灯
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();
}

}
package com.java.jikexueyuan.commandmode.command;

import com.java.jikexueyuan.commandmode.device.Stereo;
//打开音响,并选择歌曲
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();
}

}
package com.java.jikexueyuan.commandmode.command;
//空指令
public class NoCommand implements Command {

@Override
public void execute() {
// TODO Auto-generated method stub

}

@Override
public void undo() {
// TODO Auto-generated method stub

}

}
package com.java.jikexueyuan.commandmode.command;

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()
{
//假设左右各5个按钮
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;

}
//点击on按钮
@Override
public void onButton(int slot) {

onCommands[slot].execute();
stack.push(onCommands[slot]);
}
//点击off按钮
@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();
}

}
package com.java.jikexueyuan.commandmode.command;
//宏命令
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();

}
}

}
package com.java.jikexueyuan.commandmode.command;

import com.java.jikexueyuan.commandmode.Control;
import com.java.jikexueyuan.commandmode.TraditionControl;
import com.java.jikexueyuan.commandmode.device.Light;
import com.java.jikexueyuan.commandmode.device.Stereo;

public class ControlTest {
//按钮设置和点击演示
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);
}

}

 

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