设计模式-命令模式
-
主要思想,将方法封装为类,重载同一个方法,实现请求者与调用者的解耦。
-
例子:
Thread类。所有交给Thread的执行的类都要实现Runnable接口的run()方法,Thread类只负责执行run()方法,而不是具体类的具体方法。 -
代码实例
/** * 需求场景,有一个遥控器,需要调用许多第三方厂家的电器的开和关功能。 * 并且不同第三方厂家的开关函数名称不同。如何实现遥控器与家电的解耦。 * 注意:遥控器所绑定的家电会不断变化,硬编码几乎无法维护。 */ /** * 遥控器类 */ public class Controller { private Command[] commands; public void setCommands(Command[] commands) { this.commands = commands; } public void invoke() { for (Command command : commands) { command.open(); command.close(); } } // 遥控器测试 public static void main(String[] args) { Controller controller = new Controller(); TVCommand tvCommand = new TVCommand(); tvCommand.setTV(new TV()); FanCommand fanCommand = new FanCommand(); fanCommand.setFan(new Fan()); Command[] commands = new Command[2]; commands[0] = tvCommand; commands[1] = fanCommand; controller.setCommands(commands); controller.invoke(); } } /** * 第三方家电,电视 */ class TV { public void on() { System.out.println("打开电视"); } public void off() { System.out.println("关闭电视"); } } /** * 第三方家电,电扇 */ class Fan { public void turnOn() { System.out.println("打开电扇"); } public void turnOff() { System.out.println("关闭电扇"); } } /** * 命令模式,将方法封装为类 */ interface Command { void open(); void close(); } /** * 方法封装,关键 */ class TVCommand implements Command { private TV tv; public void setTV(TV tv) { this.tv = tv; } @Override public void open() { tv.on(); } @Override public void close() { tv.off(); } } class FanCommand implements Command { private Fan fan; public void setFan(Fan fan) { this.fan = fan; } @Override public void open() { fan.turnOn(); } @Override public void close() { fan.turnOff(); } }