命令模式结构:
![]()
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace DesignMode.BehavioralPattern
8 {
9 #region 命令模式要点
10 //命令模式是把一个操作或者行为抽象为一个对象中,通过对命令的抽象化来使得发出命令的责任和执行命令的责任分隔开。
11 //该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。
12 //
13 //应用场景:
14 //1.将操作放入队列中、 操作的执行或者远程执行操作
15 //2.实现操作回滚功能
16 //3.通过操作来参数化对象
17 //
18 //实现方式:
19 /*
20 1.声明仅有一个执行方法的命令接口。
21
22 2.抽取请求并使之成为实现命令接口的具体命令类。
23 每个类都必须有一组成员变量来保存请求参数和对于实际接收者对象的引用。
24 所有这些变量的数值都必须通过命令构造函数进行初始化。
25
26 3.找到担任发送者职责的类。
27 在这些类中添加保存命令的成员变量。发送者只能通过命令接口与其命令进行交互。
28 发送者自身通常并不创建命令对象, 而是通过客户端代码获取。
29
30 4.修改发送者使其执行命令, 而非直接将请求发送给接收者。
31
32 5.客户端必须按照以下顺序来初始化对象:
33 创建接收者。创建命令, 如有需要可将其关联至接收者。创建发送者并将其与特定命令关联。
34 */
35
36 #endregion
37 public interface ICommandPattern
38 {
39 void Execute();
40 }
41
42
43 //具体命令 (Concrete Commands) 会实现各种类型的请求。
44 //具体命令自身并不完成工作, 而是会将调用委派给一个业务逻辑对象。但为了简化代码, 这些类可以进行合并。
45 //接收对象执行方法所需的参数可以声明为具体命令的成员变量。
46 //你可以将命令对象设为不可变, 仅允许通过构造函数对这些成员变量进行初始化。
47 public class ConcreteCommand : ICommandPattern
48 {
49 private string _paramStr;
50 private int _paramInt;
51 Receiver _receiver;
52 public ConcreteCommand(string paramStr, int paramInt, Receiver receiver)
53 {
54 _paramStr = paramStr;
55 _paramInt = paramInt;
56 _receiver = receiver;
57 }
58
59 public void Execute()
60 {
61 _receiver.DoBussinessLogic();
62 }
63 }
64
65
66 //发送者 (Sender)——亦称 “触发者 (Invoker)”——类负责对请求进行初始化, 其中必须包含一个成员变量来存储对于命令对象的引用。
67 //发送者触发命令, 而不向接收者直接发送请求。
68 //注意, 发送者并不负责创建命令对象: 它通常会通过构造函数从客户端处获得预先生成的命令。
69 public class Invoker
70 {
71 ICommandPattern _command;
72 public Invoker(ICommandPattern command)
73 {
74 _command = command;
75 }
76
77 public void Invoke()
78 {
79 _command.Execute();
80 }
81 }
82
83 //接收者 (Receiver) 类包含部分业务逻辑。几乎任何对象都可以作为接收者。
84 //绝大部分命令只处理如何将请求传递到接收者的细节, 接收者自己会完成实际的工作。
85 public class Receiver
86 {
87 public void DoBussinessLogic()
88 {
89 Console.WriteLine("Receiver ExecuteCommand");
90 }
91 }
92
93 //客户端 (Client) 会创建并配置具体命令对象。
94 //客户端必须将包括接收者实体在内的所有请求参数传递给命令的构造函数。
95 //此后, 生成的命令就可以与一个或多个发送者相关联了。
96 public class CommandClient
97 {
98 public static void Test()
99 {
100 Receiver receiver = new Receiver();
101 ICommandPattern command = new ConcreteCommand("", 0, receiver);
102 Invoker invoker = new Invoker(command);
103
104 invoker.Invoke();
105 }
106
107 }
108 }