参考博客:https://www.cnblogs.com/java-my-life/archive/2012/06/01/2526972.html 侵权删除
2019-06-27 15:10:03
什么是命令模式:一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
适用性:
基本类图:见参考博客
命令模式的本质: 1、将行为(接受者的行为)封装为对象(Command对象),使得我们可以通过对该对象的操作而实现对行为的操作。2、通过Command类引入间接性
命令模式的基本成员:
抽象接收者: 将多个具体接受者抽象
具体接受者:实际执行行为的对象
抽象命令:多种命名的抽象
具体命令:命令对象,成员有接受者的引用和执行命令的方法。
命令请求者:发出请求的对象,成员有命令对象和发出命令请求的方法。
客户端:装配命令和命令请求者
命令模式的基本代码:
/** * @InterfaceName Command * @Author wangyudi * @Date 2019/6/27 14:51 * @Version 1.0 * @Description 抽象命令类 */ public interface Command { public void execute(); } /** * @ClassName CommandTurnOn * @Author wangyudi * @Date 2019/6/27 14:52 * @Version 1.0 * @Description 具体命令类 */ public class CommandTurnOn implements Command { //传入具体的接受者,实际的执行者 private Light light; public CommandTurnOn(Light light){ this.light = light; } @Override public void execute() { light.TurnOn(); } } /** * @ClassName CommandTurnDown * @Author wangyudi * @Date 2019/6/27 14:52 * @Version 1.0 * @Description 具体命令类 */ public class CommandTurnDown implements Command { //传入具体的接受者,实际的执行者 private Light light; public CommandTurnDown(Light light){ this.light = light; } @Override public void execute() { light.TurnDown(); } }
/** * @ClassName Light * @Author wangyudi * @Date 2019/6/27 14:53 * @Version 1.0 * @Description 接受者 */ public class Light { public void TurnOn(){ System.out.println("Light turn on"); } public void TurnDown(){ System.out.println("Light turn off"); } }
import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; /** * @ClassName Switch * @Author wangyudi * @Date 2019/6/27 14:57 * @Version 1.0 * @Description 命令请求者 */ public class Switch { private Command commandOn; private Command commandDown; private ArrayList<Command> commands; public Switch(Command commandOn, Command commandDown) { this.commandOn = commandOn; this.commandDown = commandDown; commands = new ArrayList<Command>(); } public void add(Command command){ commands.add(command); } public void executeCommands(){ for(Command e :commands) e.execute(); } public void turnOn(){ commandOn.execute(); } public void turnDown(){ commandDown.execute(); } }
/** * @ClassName TestCase * @Author wangyudi * @Date 2019/6/27 15:01 * @Version 1.0 * @Description 测试用例 */ public class TestCase { public static void main(String[] args) { Light light = new Light(); CommandTurnDown commandTurnDown = new CommandTurnDown(light); CommandTurnOn commandTurnOn = new CommandTurnOn(light); Switch aSwitch = new Switch(commandTurnDown, commandTurnOn); aSwitch.turnDown(); //实例化一个命令,并执行(可以写成 aSwitch.turnDown(new CommandTurnDown(light)); ) aSwitch.turnOn(); System.out.println("================================================="); aSwitch.add(new CommandTurnOn(light)); //实例化一个命令,并将该命令对象放入队列中 aSwitch.add(new CommandTurnDown(light)); aSwitch.add(new CommandTurnOn(light)); aSwitch.executeCommands(); //执行队列中的所有命令 } } //结果 Light turn on Light turn off ================================================= Light turn on Light turn off Light turn on