命令模式
所有电器命令的接口
interface Command{
//执行动作
public void execute();
//撤销命令
public void undo();
}
具体电器类
class LightReceiver{
public void on(){
System.out.println("电灯开了");
}
public void off(){
System.out.println("电灯关闭了");
}
}
class TvReceiver{
public void on(){
System.out.println("电视机开了");
}
public void off(){
System.out.println("电视机关了");
}
}
电器命令实现类
电灯的开和关命令
class LightOnCommand implements Command{
private LightReceiver lightReceiver;
public LightOnCommand(LightReceiver lightReceiver) {
this.lightReceiver = lightReceiver;
}
@Override
public void execute() {
lightReceiver.on();
}
@Override
public void undo() {
lightReceiver.off();
}
}
class LightOffCommand implements Command{
private LightReceiver lightReceiver;
public LightOffCommand(LightReceiver lightReceiver) {
this.lightReceiver = lightReceiver;
}
@Override
public void execute() {
lightReceiver.off();
}
@Override
public void undo() {
lightReceiver.on();
}
}
电视的开和关命令
class OnTVCommand implements Command{
private TvReceiver tvReceiver;
public OnTVCommand(TvReceiver tvReceiver) {
this.tvReceiver = tvReceiver;
}
@Override
public void execute() {
tvReceiver.on();
}
@Override
public void undo() {
tvReceiver.off();
}
}
class OffTVCommand implements Command{
private TvReceiver tvReceiver;
public OffTVCommand(TvReceiver tvReceiver) {
this.tvReceiver = tvReceiver;
}
@Override
public void execute() {
tvReceiver.off();
}
@Override
public void undo() {
tvReceiver.on();
}
}
什么都不做的空命令
class NoCommand implements Command{
@Override
public void execute() {
}
@Override
public void undo() {
}
}
遥控器
class RemoteCommand{
Command[] onCommands;
Command[] offCommands;
//撤销的命令
Command undoCommand;
public RemoteCommand(){
onCommands = new Command[5];
offCommands = new Command[5];
for (int i = 0; i <5 ; i++) {
onCommands[i] = new NoCommand();
offCommands[i] = new NoCommand();
}
}
//给按钮设置功能
public void setCommand(int no,Command oncommand,Command offcommand){
onCommands[no] = oncommand;
offCommands[no] = offcommand;
}
//执行按下的开的按钮
public void onButtonWasPushed(int no){
onCommands[no].execute();
//记录操作
undoCommand = onCommands[no];
}
//执行按下的关的按钮
public void offButtonWasPushed(int no){
offCommands[no].execute();
//记录操作
undoCommand = offCommands[no];
}
//按下撤销按钮
public void undoButtonWasPushed(){
undoCommand.undo();
}
}
测试类
public class CommandTest {
public static void main(String[] args) {
LightReceiver lightReceiver = new LightReceiver();
LightOnCommand lightOnCommand = new LightOnCommand(lightReceiver);
LightOffCommand lightOffCommand = new LightOffCommand(lightReceiver);
TvReceiver tvReceiver = new TvReceiver();
OnTVCommand onTVCommand = new OnTVCommand(tvReceiver);
OffTVCommand offTVCommand = new OffTVCommand(tvReceiver);
RemoteCommand remoteCommand = new RemoteCommand();
remoteCommand.setCommand(0,lightOnCommand,lightOffCommand);
remoteCommand.setCommand(1,onTVCommand,offTVCommand);
remoteCommand.onButtonWasPushed(0);
remoteCommand.undoButtonWasPushed();
remoteCommand.offButtonWasPushed(0);
remoteCommand.undoButtonWasPushed();
remoteCommand.onButtonWasPushed(1);
remoteCommand.undoButtonWasPushed();
remoteCommand.offButtonWasPushed(1);
remoteCommand.undoButtonWasPushed();
}
}
这种设计遵守了开闭原则,添加一个具体电器,不需要对遥控器进行修改