设计模式-命令模式

设计模式-命令模式一 命令模式命令模式 Command Pattern 是一种数据驱动的设计模式 它属于行为型模式 请求以命令的形式包裹在对象中 并传给调用对象 调用对象寻找可以处理该命令的合适对象 并把该命令传给相应的对象 该对象执行命令 二 介绍 2

大家好,欢迎来到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

(0)
上一篇 2025-01-01 18:33
下一篇 2025-01-01 19:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信