命令模式 喜欢ヅ旅行 2022-10-29 04:27 18阅读 0赞 最近在看CQRS,里边涉及到了命令模式,这篇文章就是对命令模式进行一个回顾再学习,文中的主要内容来自这篇文章:https://www.jianshu.com/p/5901e76a6348。 命令模式的定义:命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式;命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分隔开,委派给不同的对象。每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方接收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收、以及操作是否被执行、何时被执行、怎么被执行的。命令允许请求的一方和接收请求的一方能够独立演化,从而具有如下的优点: 1. 命令模式使新的命令很容易被加入到系统里。 2. 允许接受请求的一方决定是否要否决请求。 3. 能较容易的设计一个命令队列。 4. 可以容易的实现对请求的撤销和恢复。 5. 在需要的情况下,可以较容易的将命令记入日志。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hb3llcWl1_size_16_color_FFFFFF_t_70][] 命令模式涉及到五个角色,他们分别是: 1. 客户端角色(Client):创建一个具体命令ConcreteCommand对象并确定其接收者。 2. 命令角色(Command): 声明一个给所有具体命令类的抽象接口。 3. 具体命令角色(ConcreteCommand):定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。 4. 请求者角色(Invoker):负责调用命令对象执行请求,相关的方法叫做行动方法。 5. 接收者角色(Receiver):负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。 ## AudioPlayer系统 ## 小女孩茱莉(Julia)有一个盒式录音机,此录音机有播音Play、倒带Rewind、停止Stop功能。录音机的键盘便是请求者角色`Invoker`;茱莉(Julia)是客户端角色`Client`,而录音机便是接收者角色`Receiver`。 `Command`类扮演抽象命令角色,而`PlayCommand`、`StopCommand`、`RewindCommand`便是具体命令类。茱莉(Julia)不需要知道播音、倒带、停止功能是怎么具体执行的,这些命令的执行细节全部由键盘`Keypad`具体实施。茱莉(Julia)只需要在键盘上按下相应的键就可以了。 录音机是典型的命令模式。录音机按键吧客户端和录音机的操作细节分隔开来。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hb3llcWl1_size_16_color_FFFFFF_t_70 1][] ### 示例代码 ### 接收者角色,由录音机类扮演 public class AudioPlayer { public void play() { System.out.println("播放……"); } public void rewind() { System.out.println("倒带……"); } public void stop() { System.out.println("停止……"); } } 抽象命令角色类 public interface Command { /** * 执行方法 */ void execute(); } 具体命令角色类 public class PlayCommand implements Command { private AudioPlayer audio; public PlayCommand(AudioPlayer audio) { this.audio = audio; } /** * 执行方法 */ @Override public void execute() { audio.play(); } } public class RewindCommand implements Command { private AudioPlayer audio; public RewindCommand(AudioPlayer audio) { this.audio = audio; } /** * 执行方法 */ @Override public void execute() { audio.rewind(); } } public class StopCommand implements Command { private AudioPlayer audio; public StopCommand(AudioPlayer audio) { this.audio = audio; } /** * 执行方法 */ @Override public void execute() { audio.stop(); } } 请求者角色,由键盘类扮演 public class Keypad { private Command playCommand; private Command rewindCommand; private Command stopCommand; public void setPlayCommand(Command playCommand) { this.playCommand = playCommand; } public void setRewindCommand(Command rewindCommand) { this.rewindCommand = rewindCommand; } public void setStopCommand(Command stopCommand) { this.stopCommand = stopCommand; } /** * 执行播放方法 */ public void play() { playCommand.execute(); } /** * 执行倒带方法 */ public void rewind() { rewindCommand.execute(); } /** * 执行停止播放的方法 */ public void stop() { stopCommand.execute(); } } 客户端类,由茱莉小女孩扮演 public class Julia { public static void main(String[] args) { //创建接收者对象 AudioPlayer audioPlayer = new AudioPlayer(); //创建命令对象 Command playCommand = new PlayCommand(audioPlayer); Command rewindCommand = new RewindCommand(audioPlayer); Command stopCommand = new StopCommand(audioPlayer); //创建请求者对象 Keypad keypad = new Keypad(); keypad.setPlayCommand(playCommand); keypad.setRewindCommand(rewindCommand); keypad.setStopCommand(stopCommand); //测试 keypad.play(); keypad.rewind(); keypad.stop(); keypad.play(); keypad.stop(); } } 运行结果如下: 播放…… 倒带…… 停止…… 播放…… 停止…… [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hb3llcWl1_size_16_color_FFFFFF_t_70]: /images/20221024/6a54837474df49099b8eb2a76b95110a.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hb3llcWl1_size_16_color_FFFFFF_t_70 1]: /images/20221024/3e6623acb85d483c9c446f1968832aa4.png
相关 命令模式 最近在看CQRS,里边涉及到了命令模式,这篇文章就是对命令模式进行一个回顾再学习,文中的主要内容来自这篇文章:https://www.jianshu.com/p/5901e76 喜欢ヅ旅行/ 2022年10月29日 04:27/ 0 赞/ 19 阅读
相关 命令模式 ![这里写图片描述][SouthEast] / 士兵 @author Administrator / public class Soldier { 浅浅的花香味﹌/ 2022年06月06日 00:05/ 0 赞/ 65 阅读
相关 命令模式 命令模式 命令模式最常见的应用场景是:有时需要向某些对象发送请求,但是不知道请求的接受者是谁,也不知道请求的操作是什么。此时希望用一种松耦合的方式设计程序,使得请 男娘i/ 2022年06月05日 22:40/ 0 赞/ 113 阅读
相关 命令模式 1.使用场景: 所谓命令模式就是将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。在数据库的事务处理 忘是亡心i/ 2022年05月31日 09:14/ 0 赞/ 106 阅读
相关 命令模式 定义 命令模式将请求封装成对象,以便使用不同的请求,队列,或者日志来参 数化其他对象。命令模式也支持可撤销的操作。 模式结构 盗用一下UML图 ![命令模 àì夳堔傛蜴生んèń/ 2022年05月09日 09:54/ 0 赞/ 97 阅读
相关 命令模式 命令模式:是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行 拼搏现实的明天。/ 2021年09月17日 03:48/ 0 赞/ 194 阅读
相关 命令模式 18.命令模式 ![70][] class Program { static void Main(string[] ar àì夳堔傛蜴生んèń/ 2021年09月17日 00:04/ 0 赞/ 222 阅读
相关 命令模式 1、基本概念: 在软件系统中,“ 行为请求者 ”与“ 行为实现者 ”通常呈现一种“ 紧耦合 ”。但在 [某些][Link 1] 场合,比如要对行为进行“记录、撤 喜欢ヅ旅行/ 2021年09月14日 12:44/ 0 赞/ 278 阅读
相关 命令模式 一 点睛 日常生活中,我们出去吃饭都会遇到下面的场景。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_ 叁歲伎倆/ 2021年07月24日 16:11/ 0 赞/ 258 阅读
相关 命令模式 令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,... 小灰灰/ 2020年06月13日 05:45/ 0 赞/ 701 阅读
还没有评论,来说两句吧...