命令模式:命令模式将发出请求的对象和执行请求的对象解耦,在被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接受者和一个或者一组动作。
遥控器控制房间内的电器:现有一个遥控器现有两排按钮,每排七个,第一排可以控制电器的打开,对应的第二排可以控制电器的关闭。
每个电器都有自己的 打开和关闭的方法。
在这个例子中遥控器是发出请求的对象,而电器是执行请求的对象,为了不在遥控器对象的类中直接耦合电器对象,采用命令模式来解耦两者。
类图:
Command接口:
public interface Command { public void execute(); // 提供一个 执行的方法 }
命令对象 LightOnCommand类 实现Command接口:
public class LightOnCommand implements Command { private Light light; // 保存 执行请求的对象 的变量 public void setLight(Light light) { this.light = light; } @Override public void execute() { light.on(); //调用 执行请求的对象 的方法 来完成请求 } }
命令对象 LightOffCommand类 实现Command接口:
执行请求的对象 Light类 提供了on()和off()方法:
public class Light { public void on() { System.out.println("打开灯。。。。"); } public void off() { System.out.println("关闭灯。。。。"); } }
发送请求的对象 RemoteControl类 :
public class RemoteControl { //模拟最简单的情况 , 一个遥控器只有两个按钮 ,一个按钮打开灯 ,另一个按钮关闭灯 private Command oncommand; //保存 打开命令对象 的变量 private Command offcommand; //保存 关闭命令对象 的变量 public void setCommand(Command oncommand,Command offcommand) { this.oncommand = oncommand; this.offcommand = offcommand; } public void buttonOn() //打开灯的按钮 按下后 执行 打开命令对象的execute()方法 { this.oncommand.execute(); } public void buttoOff() //关闭灯的按钮 按下后 执行 关闭命令对象的execute()方法 { this.offcommand.execute(); } }
最后 ,写一个测试类 ,提供入口main方法: