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 聊天会话] 涂聚文: ' 很高兴你能加入我们!' |
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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