CSharp: Mediator Pattern in donet core 3

 

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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/// <summary>
 /// 中介者模式 Mediator Pattern 亦称: 调解人、控制器、Intermediary、Controller、Mediator
 /// geovindu,Geovin Du, Edit
 /// </summary>
 interface IMediator
 {
     /// <summary>
     ///
     /// 注册
     /// </summary>
     /// <param name="friend"></param>
     void Register(AbstractFriend friend);
     /// <summary>
     ///
     /// 发送
     /// </summary>
     /// <param name="fromFriend"></param>
     /// <param name="toFriend"></param>
     /// <param name="msg"></param>
     void Send(AbstractFriend fromFriend, AbstractFriend toFriend, string msg);
     /// <summary>
     /// 显示详情
     /// </summary>
     void DisplayDetails();
 }
 /// <summary>
 ///
 ///
 /// </summary>
 class ConcreteMediator : IMediator
 {
     /// <summary>
     ///
     /// </summary>
     List<AbstractFriend> participants = new List<AbstractFriend>();
     /// <summary>
     /// 注册
     /// </summary>
     /// <param name="friend"></param>
     public void Register(AbstractFriend friend)
     {
         participants.Add(friend);
     }
     /// <summary>
     ///
     /// </summary>
     public void DisplayDetails()
     {
         Console.WriteLine("目前已登记的参加者名单如下:");
         foreach (AbstractFriend friend in participants)
         {
 
             Console.WriteLine($"{friend.Name}");
         }
     }
 
     /// <summary>
     ///
     /// </summary>
     /// <param name="fromFriend"></param>
     /// <param name="toFriend"></param>
     /// <param name="msg"></param>
     public void Send(AbstractFriend fromFriend, AbstractFriend toFriend, string msg)
     {
        
         if (participants.Contains(fromFriend))
         {
            
             if (participants.Contains(toFriend) && toFriend.Status == "On")
             {
                 Console.WriteLine($"\n[{fromFriend.Name}] 邮件: {msg} 最后一条信息发布时间: {DateTime.Now}");
                 System.Threading.Thread.Sleep(1000);
             
                 toFriend.ReceiveMessage(fromFriend, msg);
             }
             else
             {
                 Console.WriteLine($"\n{fromFriend.Name},此时,你无法发信息给{toFriend.Name} ,因为他不是注册用户就是离线了.");
             }
         }
       
         else
         {
             Console.WriteLine($"\n一个外面的朋友是: {fromFriend.Name} 属于 [{fromFriend.GetType()}] 是想传达信息给 {toFriend.Name}.");
         }
     }
 }
 /// <summary>
 ///
 ///
 /// </summary>
 abstract class AbstractFriend
 {
     /// <summary>
     ///
     /// </summary>
     IMediator mediator;
 
     /// <summary>
     ///
     /// </summary>
     public string Name { get; set; }
     /// <summary>
     ///
     /// </summary>
     public string Status { get; set; }
 
     /// <summary>
     ///
     /// </summary>
     /// <param name="mediator"></param>
     public AbstractFriend(IMediator mediator)
     {
         this.mediator = mediator;
     }
     /// <summary>
     /// 发送信息
     /// </summary>
     /// <param name="toFriend"></param>
     /// <param name="msg"></param>
     public void SendMessage(AbstractFriend toFriend, string msg)
     {
         mediator.Send(this, toFriend, msg);
     }
     /// <summary>
     /// 接收信息
     /// </summary>
     /// <param name="fromFriend"></param>
     /// <param name="msg"></param>
     public void ReceiveMessage(AbstractFriend fromFriend, string msg)
     {
         Console.WriteLine($"{this.Name} 有一条接收信息,来自于 {fromFriend.Name} 说得是: {msg} ");
     }
 }
 /// <summary>
 ///
 /// </summary>
 class Friend : AbstractFriend
 {
     /// <summary>
     ///
     /// </summary>
     /// <param name="mediator"></param>
     public Friend(IMediator mediator)
         : base(mediator)
     {
 
     }
 }
 /// <summary>
 ///
 /// </summary> 
 class Stranger : AbstractFriend
 {
     /// <summary>
     ///
     /// </summary>
     /// <param name="mediator"></param>
     public Stranger(IMediator mediator)
         : base(mediator)
     {
 
     }
 }

  

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
/// <summary>
/// 中介者模式 Mediator Pattern 亦称: 调解人、控制器、Intermediary、Controller、Mediator
/// geovindu,Geovin Du, Edit
/// </summary>
public class Person
{
 
    /// <summary>
    ///
    /// </summary>
    public string Name;
   /// <summary>
   ///
   /// </summary>
    public ChatRoom Room;
    /// <summary>
    ///
    /// </summary>
    private List<string> chatLog = new List<string>();
    /// <summary>
    ///
    /// </summary>
    /// <param name="name"></param>
    public Person(string name) => Name = name;
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="message"></param>
    public void Receive(string sender, string message)
    {
        string s = $"{sender}: '{message}'";
        Console.WriteLine($"[{Name}'s 聊天会话] {s}");
        chatLog.Add(s);
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="message"></param>
    public void Say(string message) => Room.Broadcast(Name, message);
    /// <summary>
    ///
    /// </summary>
    /// <param name="who"></param>
    /// <param name="message"></param>
    public void PrivateMessage(string who, string message)
    {
        Room.Message(Name, who, message);
    }
}
/// <summary>
///
/// </summary>
public class ChatRoom
{
    /// <summary>
    ///
    /// </summary>
    private List<Person> people = new List<Person>();
    /// <summary>
    ///
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    public void Broadcast(string source, string message)
    {
        foreach (var p in people)
            if (p.Name != source)
                p.Receive(source, message);
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="p"></param>
    public void Join(Person p)
    {
        string joinMsg = $"{p.Name} 加入聊天室";
        Broadcast("房间", joinMsg);
 
        p.Room = this;
        people.Add(p);
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="source"></param>
    /// <param name="destination"></param>
    /// <param name="message"></param>
    public void Message(string source, string destination, string message)
    {
        people.FirstOrDefault(p => p.Name == destination)?.Receive(source, message);
    }
}

  

调用:

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
//中介者模式 Mediator Pattern
  Console.WriteLine("***中介者模式 Mediator Pattern.***\n");
 
  IMediator mediator = new ConcreteMediator();
 
  Friend friend1 = new Friend(mediator);
  friend1.Name = "geovindu";
  friend1.Status = "On";
  Friend friend2 = new Friend(mediator);
  friend2.Name = "涂聚文";
  friend2.Status = "On";
 
  Stranger stranger1 = new Stranger(mediator);
  stranger1.Name = "涂年生";
  stranger1.Status = "On";
 
 
  mediator.Register(friend1);
  mediator.Register(friend2);
  mediator.Register(stranger1);
 
 
  mediator.DisplayDetails();
 
  Console.WriteLine("交流始于参与者之间...");
  friend1.SendMessage(friend2, "你好 涂聚文,我们能讨论一下中介模式吗?");
  friend2.SendMessage(friend1, "你好 geovindu,是的,我们现在就可以讨论.");
  stranger1.SendMessage(friend1, " 你好吗?");
 
 
  Friend friend4 = new Friend(mediator);
  friend4.Name = "李心";
 
  friend4.SendMessage(stranger1, "你好涂年生...");
 
 
  friend1.SendMessage(friend4, "你好,李心...");
 
  Stranger stranger2 = new Stranger(mediator);
  stranger2.Name = "杰克";
 
  stranger2.SendMessage(stranger1, "你好,朋友...");
 
  Console.WriteLine("涂聚文正在离线.");
  friend2.Status = "Off";
 
  friend1.SendMessage(friend2, "你好,涂聚文, 我有一个礼物送给你!");
  Console.WriteLine("涂聚文,又开始上线了.");
  friend2.Status = "On";
  stranger1.SendMessage(friend2, "你好,涂聚文,geovindu 正找过你.");
 
  Console.WriteLine();
  //
  var room = new ChatRoom();
  var john = new Person("geovindu");
  var jane = new Person("涂聚文");
 
  room.Join(john);
  room.Join(jane);
 
  john.Say("hi 涂聚文");
  jane.Say("oh, hey geovindu");
 
  var simon = new Person("李重心");
  room.Join(simon);
  simon.Say("各位好!");
 
  jane.PrivateMessage("李重心", "很高兴你能加入我们!");
 
 
 
  Console.Read();

  

输出:

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
***中介者模式 Mediator Pattern.***
 
目前已登记的参加者名单如下:
geovindu
涂聚文
涂年生
交流始于参与者之间...
 
[geovindu] 邮件: 你好 涂聚文,我们能讨论一下中介模式吗? 最后一条信息发布时间: 2022/10/11 21:34:49
涂聚文 有一条接收信息,来自于 geovindu 说得是: 你好 涂聚文,我们能讨论一下中介模式吗?
 
[涂聚文] 邮件: 你好 geovindu,是的,我们现在就可以讨论. 最后一条信息发布时间: 2022/10/11 21:34:50
geovindu 有一条接收信息,来自于 涂聚文 说得是: 你好 geovindu,是的,我们现在就可以讨论.
 
[涂年生] 邮件:  你好吗? 最后一条信息发布时间: 2022/10/11 21:34:51
geovindu 有一条接收信息,来自于 涂年生 说得是:  你好吗?
 
一个外面的朋友是: 李心 属于 [MediatorPatternModifiedDemo.Friend] 是想传达信息给 涂年生.
 
geovindu,此时,你无法发信息给李心 ,因为他不是注册用户就是离线了.
 
一个外面的朋友是: 杰克 属于 [MediatorPatternModifiedDemo.Stranger] 是想传达信息给 涂年生.
涂聚文正在离线.
 
geovindu,此时,你无法发信息给涂聚文 ,因为他不是注册用户就是离线了.
涂聚文,又开始上线了.
 
[涂年生] 邮件: 你好,涂聚文,geovindu 正找过你. 最后一条信息发布时间: 2022/10/11 21:34:52
涂聚文 有一条接收信息,来自于 涂年生 说得是: 你好,涂聚文,geovindu 正找过你.
 
[geovindu's 聊天会话] 房间: '涂聚文 加入聊天室'
[涂聚文's 聊天会话] geovindu: 'hi 涂聚文'
[geovindu's 聊天会话] 涂聚文: 'oh, hey geovindu'
[geovindu's 聊天会话] 房间: '李重心 加入聊天室'
[涂聚文's 聊天会话] 房间: '李重心 加入聊天室'
[geovindu's 聊天会话] 李重心: '各位好!'
[涂聚文's 聊天会话] 李重心: '各位好!'
[李重心's 聊天会话] 涂聚文: '很高兴你能加入我们!'

  

posted @   ®Geovin Du Dream Park™  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
历史上的今天:
2018-10-11 SQL Server: Datetime,Datetime2
2016-10-11 MySQL 5.7 create VIEW or FUNCTION or PROCEDURE
< 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
点击右上角即可分享
微信分享提示