大家好,欢迎来到IT知识分享网。
一、命令模式
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象,调用对象寻找可以处理该命令的合适对象,并把该命令传给相应的对象,该对象执行命令。
二、介绍
2.1 意图
将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化。
2.2 主要解决
在软件系统中,行为请求者与行为实现者通常是一个紧耦合的关系,但某些场合,比如需要堆行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不合适了。
2.3 何时使用
在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的,在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
2.4 如何解决
通过调用者调用接受者执行命令,顺序:调用者》命令》接受者
2.5 关键代码
定义三个角色:1、received真正的命令执行对象 2、Command 3、invoker使用命令对象的入口;
2.6 优缺点
优点:1、降低了系统耦合度。2、新的命令可以很容易添加到系统中去。
缺点:使用命令模式可能会导致某些系统有很多的具体命令类。
2.7 使用场景
认为是命令的地方都可以使用命令模式,比如:1、GUI中每一个按钮都是一条命令。2、模拟CMD
2.8 注意事项
系统需要支持命令的撤销(undo)和恢复(Redo)操作,也可以考虑使用命令模式。
UML示例图:
三、实现
代码场景: 厂商提供一个遥控器,遥控器有个按钮开关,需要你往这个遥控器上加不同的电器,如: 灯、风扇、空调、门
代码分析: 命令模式将电器的操作请求封装成对象
灯,命令的真正执行者
/ * @ClassName Light * @Description 灯的真正执行者 / public class Light { public void on() { System.out.println("开灯"); } public void off() { System.out.println("关灯"); } }
命令接口: 上面有个操作的按钮,当然你也可以添加其他操作,如: undo
/ * @ClassName Command * @Description 命令接口 / public interface Command { void execute(); }
将开灯这个请求封装成命令对象,如果有其他电器的操作,也可以封装成命令对象
/ * @ClassName LightOnCommand * @Description 开灯命令对象 / public class LightOnCommand implements Command{ private Light light; // 使用委托解耦 public LightOnCommand(Light light) { this.light = light; } @Override public void execute() { light.on(); } }
(遥控器)命令调用者:将命令安装到遥控器上,同时提供按下按钮,执行该命令的操作
/ * @ClassName CommandController * @Description 命令调用着invoke / public class CommandController { private Command solt; public void setCommand(Command command) { solt = command; } / * @Description: 遥控器 按钮按下 * @return: void / public void buttonWasPressed() { solt.execute(); } }
客户端调用:
/ * @ClassName MainClient * @Description 客户端使用 * @Author zhoushubin * @Date 2022/3/8 19:46 / public class MainClient { public static void main(String[] args) { LightOnCommand lightOnCommand = new LightOnCommand(new Light()); CommandController commandController = new CommandController(); commandController.setCommand(lightOnCommand); commandController.buttonWasPressed(); } }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/165641.html