6命令模式
Posted use-d
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6命令模式相关的知识,希望对你有一定的参考价值。
命令模式定义:将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。
- 命令模式将发出请求的对象(RemoteControl遥控器类)和执行请求的对象(点灯类)解耦;
- 在被解耦的对象之间通过Command对象进行沟通(例如LightCommand封装Light类的开灯与关灯命令);
- 调用者通过调用命令execute()发出请求,execute()调用实际的执行者;
- 调用者可以接收命令参数,甚至在运行时动态的进行(动态把命令绑定到调用者遥控器上,并且调用者遥控器是针对接口编程);
- 命令可以支持undo撤销操作,在调用者(遥控器)上可以记录上一个执行的命令,调用undo撤销上一个命令即可;
- 命令模式可以实现日志与队列系统:
日志系统:可以将执行的每个命令记录到日志系统中,当系统崩溃或者死机后,可以根据日志系统的命令在重新执行一遍,对系统进行还原;
队列系统:工作队列,把实际的工作对象与调用者进行解耦,例如:线程池等;
定义命令接口:用于规范每个命令需要实现的方法
public interface Command { void execute(); void undo(); }
定义 灯类:灯下包括打开 与 关闭 两个命令。
public class Light { private String name; public Light(String name) { this.name = name; } public void on(){ System.out.println("开灯"); } public void off(){ System.out.println("关灯"); } }
定义灯命令类:用于封装灯的开灯 与关灯 命令。
public class LightCommand implements Command { private Light light; public LightCommand(Light light){ this.light = light; } @Override public void execute(){ light.on(); } @Override public void undo(){ light.off(); } }
定义NoCommand命令,针对遥控器上没有命令的数字按键。
public class NoCommand implements Command { public NoCommand(){ } @Override public void execute(){ System.out.println("没有打开命令"); } @Override public void undo(){ System.out.println("没有关闭命令"); } }
定义遥控器类:
定义存放命令的数组;
针对用户的打开与关闭两个命令;
public class RemoteControl { Command[] commands; public RemoteControl() { commands = new Command[10]; for(int i=0;i<10;i++) { commands[i] = new NoCommand(); } } public void setCommands(int slot,Command onCommand) { commands[slot] = onCommand; } public void onButton(int slot) { commands[slot].execute(); } public void offButton(int slot) { commands[slot].undo(); } }
测试类:
public class Test { public static void main(String[] args) { Light light = new Light("电灯"); LightCommand lightCommand = new LightCommand(light); RemoteControl control = new RemoteControl(); control.setCommands(0,lightCommand); control.onButton(0); control.offButton(0); control.onButton(1); control.offButton(1); } } 执行结果: 开灯 关灯 没有打开命令 没有关闭命令
以上是关于6命令模式的主要内容,如果未能解决你的问题,请参考以下文章