随笔 - 77  文章 - 1 评论 - 10 阅读 - 68913
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

命令模式(Command)是一种对象行为模式,它是把一个请求封装到一个对象中,使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。命令模式是对命令的封装,它把发出命令的责任与执行命令的责任分开,分别委派给不同的对象。如下图是命令模式的结构图:

这里的参与者都有:

Command
— 声明执行操作的接口。
ConcreteCommand 
— 将一个接收者对象绑定于一个动作。
— 调用接收者相应的操作,以实现 Execute
•Client
— 创建一个具体命令对象并设定它的接收者。
Invoker
— 要求该命令执行这个请求。
•Receiver
— 知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。

由结构图给出对应的类设计,代码如下:

复制代码
 1 class Invoker{//要求命令执行请求
 2     private Command command;
 3     public Invoker(Command c){
 4         command=c;
 5     }
 6     public void action(){
 7         System.out.println("execute command action");
 8         command.execute();
 9     }
10 }
11 class Receiver{//实施执行与请求相关的操作
12     public void action(){
13         System.out.println("this is Receiver's action,I will complete service");
14     }
15 }
16 interface Command{
17     void execute();
18 }
19 class ConcreteCommand implements Command{//将一个接收者对象绑定一个动作,并调用接收者相应的操作,以实现execute
20     private Receiver rec;
21     public ConcreteCommand(Receiver rec){
22         this.rec=rec;
23     }
24     public void execute(){
25         System.out.println("Call Receiver's action");
26         rec.action();
27     }
28 }    
29 public class Test{
30     public static void main(String[] args) {
31         Receiver rec=new Receiver();
32         Command com=new ConcreteCommand(rec);
33         Invoker inv=new Invoker(com);
34         inv.action();
35     }
36 }
View Code
复制代码

这里,我们定义好命令的接收者对象Receiver,然后将其传递给命令对象com,最后由inv要求该命令执行这个请求。从这里可以看出,命令模式将发出命令与执行命令这两个动作分开了,Command发出命令,但催动该命令的执行是Invoker完成的。所以,如果有排队需求的话,可以在Invoker这里设置相关功能。

 

posted on   Judy518  阅读(160)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示