約瑟夫環經典問題
阿新 • • 發佈:2021-06-29
命令模式結構:
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 }