-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
128 lines (111 loc) · 3.95 KB
/
Copy pathProgram.cs
File metadata and controls
128 lines (111 loc) · 3.95 KB
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using System;
using System.Collections.Generic;
#region 场景描述
/*
介绍
意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
*/
#endregion
/// <summary>
/// 14-行为型:命令模式
/// </summary>
namespace _14CommandPattern
{
/// <summary>
/// 步骤 5 使用 Broker 类来接受并执行命令。
/// </summary>
class Program
{
static void Main(string[] args)
{
Stock stock = new Stock();
BuyStock buyStock = new BuyStock(stock);
SellStock sellStock = new SellStock(stock);
Broker broker = new Broker();
broker.TakeOrder(buyStock);
broker.TakeOrder(sellStock);
broker.PlaceOrders();
Console.ReadKey();
}
}
#region 基础类构建
/// <summary>
/// 步骤 1 创建一个命令接口。
/// </summary>
public interface Order
{
void Execute();
}
/// <summary>
/// 步骤 2 创建一个请求类。
/// </summary>
public class Stock
{
private string name = "ABC";
private int quantity = 10;
public void Buy()
{
Console.WriteLine("Stock [ Name: " + name + ",Quantity: " + quantity + " ] bought");
}
public void Sell()
{
Console.WriteLine("Stock [ Name: " + name + ",Quantity: " + quantity + " ] sold");
}
}
/// <summary>
/// 步骤 3 创建实现了 Order 接口的实体类。
/// </summary>
public class BuyStock : Order
{
private Stock abcStock;
public BuyStock(Stock stock)
{
this.abcStock = stock;
}
public void Execute()
{
abcStock.Buy();
}
}
public class SellStock:Order
{
private Stock abcStock;
public SellStock(Stock stock)
{
this.abcStock = stock;
}
public void Execute()
{
abcStock.Sell();
}
}
/// <summary>
/// 步骤 4 创建命令调用类。
/// </summary>
public class Broker
{
private List<Order> listOrders = new List<Order>();
public void TakeOrder(Order order)
{
listOrders.Add(order);
}
public void PlaceOrders()
{
foreach (Order item in listOrders)
{
item.Execute();
}
listOrders.Clear();
}
}
#endregion
}