package DesignPattern;public class CommondPattern { //命令模式的要点:分离发令者,命令,与接令者 //将接令者对外暴露的接口包装成为一致的命令 //发令者拥有命令的实例,发令者调用命令实例,命令实例调用接令者接口从而实现命令动作 //优点:接令者的暴露在外的接口被一致化,增加命令功能,只需要继承Command接口,实现自定义功能, // 完成了命令双向的解耦 //常见的命令模式:工作队列,日志请求 public static class Light{ private String name; Light(String name){ this.name=name; } void on(){ System.out.println(name+" is on!"); } void off(){ System.out.println(name+" is off!"); } } public interface Command{ void execute(); void undo(); } public static class LightOnCommand implements Command{ Light light; LightOnCommand(Light light){ this.light=light; } @Override public void execute() { light.on(); } @Override public void undo() { light.off(); } } public static class LightOffCommand implements Command{ Light light; LightOffCommand(Light light){ this.light=light; } @Override public void execute() { light.off(); } @Override public void undo() { light.on(); } } //甚至可以实现宏命令 public static class MacroCommand implements Command{ Command[] commands; MacroCommand(Command[] commands){ this.commands = commands; } @Override public void execute() { for(Command command:commands){ command.execute(); } } @Override public void undo() { } } public static class SimpleRemoteControl{ Command slot; SimpleRemoteControl(){} public void setCommand(Command slot) { this.slot = slot; } public void buttonWasPressed(){ slot.execute(); } } public static class noCommand implements Command{ @Override public void execute() {} @Override public void undo() {} } public static class RemoteControl{ Command[] onCommands; Command[] offCommands; Command undoCommand; public RemoteControl(){ onCommands= new Command[7]; offCommands= new Command[7]; Command noCommand = new noCommand(); for(int i=0;i<7;i++){ onCommands[i]=noCommand; offCommands[i]= noCommand; } undoCommand=noCommand; } /* @Param slot 插口 */ public void setCommands(int slot,Command onCommand,Command offCommand){ onCommands[slot]=onCommand; offCommands[slot]=offCommand; } public void onButtonWasPushed(int slot){ onCommands[slot].execute(); undoCommand=onCommands[slot]; } public void offButtonWasPushed(int slot){ offCommands[slot].execute(); undoCommand=offCommands[slot]; } public void undoButtonWasPushed(){ undoCommand.undo(); } public String toString() { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("\n------Remote Control------\n"); for(int i=0;i