{"id":1679,"date":"2023-04-24T12:25:34","date_gmt":"2023-04-24T05:25:34","guid":{"rendered":"https:\/\/csharptutorial.net\/?page_id=1679"},"modified":"2023-06-28T15:45:37","modified_gmt":"2023-06-28T08:45:37","slug":"csharp-mediator-pattern","status":"publish","type":"page","link":"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-mediator-pattern\/","title":{"rendered":"C# Mediator Pattern"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn about the C# Mediator pattern to encapsulate object interaction with loose coupling.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction to the C# Mediator pattern<\/h2>\n\n\n\n<p>The Mediator pattern defines an object (mediator) that encapsulates the interactions of other objects. The Mediator pattern promotes loose coupling by preventing objects from referring to each other explicitly and allows you to manage their interaction independently.<\/p>\n\n\n\n<p>In the Mediator pattern, a mediator object serves as an intermediary between objects that need to interact with each other. <\/p>\n\n\n\n<p>So instead of allowing objects to interact directly with each other, they communicate via the mediator object. The Mediator object can also provide a centralized point of control to coordinate the interactions between the objects:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/csharptutorial.net\/wp-content\/uploads\/2023\/04\/CSharp-Mediator-Pattern.svg\" alt=\"C# Mediator Pattern\" class=\"wp-image-1681\"\/><\/figure>\n<\/div>\n\n\n<p>The Mediator pattern promotes loose coupling between objects because they don&#8217;t need to know about each other&#8217;s details and they only have the information about the mediator object. This allows the system easier to maintain and modify because changes to one object won&#8217;t affect the others.<\/p>\n\n\n\n<p>The following UML diagram illustrates the Mediator pattern:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/csharptutorial.net\/wp-content\/uploads\/2023\/04\/CSharp-Mediator-Design-Pattern.svg\" alt=\"C# Mediator Design Pattern\" class=\"wp-image-1682\"\/><\/figure>\n<\/div>\n\n\n<p>In this diagram:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Mediator<\/code> defines an interface for communicating with <code>Colleague<\/code> objects.<\/li>\n\n\n\n<li><code>ConcreteMediator<\/code> implements cooperative behavior by coordinating <code>Colleague<\/code> objects. The <code>ConcreteMeditor<\/code> maintains a list of colleagues.<\/li>\n\n\n\n<li><code>Colleague<\/code> is an interface or abstract class that defines objects that need to interact with each other.<\/li>\n\n\n\n<li><code>ConcreteColleague<\/code> is a concrete class of the <code>Colleague<\/code> class.<\/li>\n<\/ul>\n\n\n\n<p>The following shows an implementation of the Mediator pattern in C#:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">MediatorPattern<\/span>;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Mediator<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message, Colleague colleague<\/span>)<\/span>;\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Colleague<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> Mediator _mediator;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Colleague<\/span>(<span class=\"hljs-params\">Mediator mediator<\/span>)<\/span>\n    {\n        _mediator = mediator;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span>\n    {\n        _mediator.Send(message, <span class=\"hljs-keyword\">this<\/span>);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Receive<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span>;\n}\n\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Colleague1<\/span> : <span class=\"hljs-title\">Colleague<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Colleague1<\/span>(<span class=\"hljs-params\">Mediator mediator<\/span>) : <span class=\"hljs-title\">base<\/span>(<span class=\"hljs-params\">mediator<\/span>)<\/span>\n    {\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Receive<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span> =&gt; Console.WriteLine(<span class=\"hljs-string\">$\"Colleague1 received <span class=\"hljs-subst\">{message}<\/span>\"<\/span>);\n}\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Colleague2<\/span> : <span class=\"hljs-title\">Colleague<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Colleague2<\/span>(<span class=\"hljs-params\">Mediator mediator<\/span>) : <span class=\"hljs-title\">base<\/span>(<span class=\"hljs-params\">mediator<\/span>)<\/span>\n    {\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Receive<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span> =&gt; Console.WriteLine(<span class=\"hljs-string\">$\"Colleague2 received <span class=\"hljs-subst\">{message}<\/span>\"<\/span>);\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteMediator<\/span> : <span class=\"hljs-title\">Mediator<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> Colleague1 Colleague1;\n    <span class=\"hljs-keyword\">public<\/span> Colleague2 Colleague2;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message, Colleague colleague<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">if<\/span> (colleague == Colleague1)\n        {\n            Colleague2.Receive(<span class=\"hljs-string\">$\"<span class=\"hljs-subst\">{message}<\/span> from <span class=\"hljs-subst\">{<span class=\"hljs-keyword\">nameof<\/span>(Colleague1)}<\/span>\"<\/span>);\n        }\n        <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (colleague == Colleague2)\n        {\n            Colleague1.Receive(<span class=\"hljs-string\">$\"<span class=\"hljs-subst\">{message}<\/span> from <span class=\"hljs-subst\">{<span class=\"hljs-keyword\">nameof<\/span>(Colleague2)}<\/span>\"<\/span>);\n        }\n    }\n}\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> mediator = <span class=\"hljs-keyword\">new<\/span> ConcreteMediator();\n        <span class=\"hljs-keyword\">var<\/span> c1 = <span class=\"hljs-keyword\">new<\/span> Colleague1(mediator);\n        <span class=\"hljs-keyword\">var<\/span> c2 = <span class=\"hljs-keyword\">new<\/span> Colleague2(mediator);\n\n        mediator.Colleague1 = c1;\n        mediator.Colleague2 = c2;\n\n        c1.Send(<span class=\"hljs-string\">\"Hello\"<\/span>);\n        c2.Send(<span class=\"hljs-string\">\"Hi\"<\/span>);\n\n        c1.Send(<span class=\"hljs-string\">\"Bye\"<\/span>);\n        c2.Send(<span class=\"hljs-string\">\"Bye bye\"<\/span>);\n\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, define a <code>Mediator<\/code> <a href=\"https:\/\/csharptutorial.net\/csharp-tutorial\/csharp-abstract-class\/\">abstract class<\/a> that has the <code>Send()<\/code> method for sending a message to a Colleague:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Mediator<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message, Colleague colleague<\/span>)<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Next, define the <code>Colleague<\/code> class abstract class that  serves as a base class for other colleague objects:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Colleague<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> Mediator _mediator;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Colleague<\/span>(<span class=\"hljs-params\">Mediator mediator<\/span>)<\/span>\n    {\n        _mediator = mediator;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span>\n    {\n        _mediator.Send(message, <span class=\"hljs-keyword\">this<\/span>);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Receive<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>Colleague<\/code> object knows the <code>Mediator<\/code> object. The <code>Send()<\/code> method uses the mediator object to send a message.<\/p>\n\n\n\n<p>Then, define two Colleague concrete classes that inherit from the <code>Colleague<\/code> class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Colleague1<\/span> : <span class=\"hljs-title\">Colleague<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Colleague1<\/span>(<span class=\"hljs-params\">Mediator mediator<\/span>) : <span class=\"hljs-title\">base<\/span>(<span class=\"hljs-params\">mediator<\/span>)<\/span>\n    {\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Receive<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span> =&gt; Console.WriteLine(<span class=\"hljs-string\">$\"Colleague1 received <span class=\"hljs-subst\">{message}<\/span>\"<\/span>);\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Colleague2<\/span> : <span class=\"hljs-title\">Colleague<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Colleague2<\/span>(<span class=\"hljs-params\">Mediator mediator<\/span>) : <span class=\"hljs-title\">base<\/span>(<span class=\"hljs-params\">mediator<\/span>)<\/span>\n    {\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Receive<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span> =&gt; Console.WriteLine(<span class=\"hljs-string\">$\"Colleague2 received <span class=\"hljs-subst\">{message}<\/span>\"<\/span>);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>Colleague1<\/code> and <code>Colleague2<\/code> classes implement the <code>Receive()<\/code> method that shows the message that they receive to the console.<\/p>\n\n\n\n<p>After that, define the <code><code>ConcreteMediator<\/code><\/code> class that extends the Mediator class. The <code><code>ConcreteMediator<\/code><\/code> knows the <code>Colleague1<\/code> and <code>Colleague2<\/code> objects. Its <code>Send()<\/code> method coordinates the communication between these objects:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteMediator<\/span> : <span class=\"hljs-title\">Mediator<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> Colleague1 Colleague1;\n    <span class=\"hljs-keyword\">public<\/span> Colleague2 Colleague2;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message, Colleague colleague<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">if<\/span> (colleague == Colleague1)\n        {\n            Colleague2.Receive(<span class=\"hljs-string\">$\"<span class=\"hljs-subst\">{message}<\/span> from <span class=\"hljs-subst\">{<span class=\"hljs-keyword\">nameof<\/span>(Colleague1)}<\/span>\"<\/span>);\n        }\n        <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (colleague == Colleague2)\n        {\n            Colleague1.Receive(<span class=\"hljs-string\">$\"<span class=\"hljs-subst\">{message}<\/span> from <span class=\"hljs-subst\">{<span class=\"hljs-keyword\">nameof<\/span>(Colleague2)}<\/span>\"<\/span>);\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Finally, create the <code>ConcreteMediator<\/code>, <code>Colleague1<\/code>, and <code>Colleague2 <\/code>objects and send messages from <code>Colleague1<\/code> and <code>Colleague2<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> mediator = <span class=\"hljs-keyword\">new<\/span> ConcreteMediator();\n        <span class=\"hljs-keyword\">var<\/span> c1 = <span class=\"hljs-keyword\">new<\/span> Colleague1(mediator);\n        <span class=\"hljs-keyword\">var<\/span> c2 = <span class=\"hljs-keyword\">new<\/span> Colleague2(mediator);\n\n        mediator.Colleague1 = c1;\n        mediator.Colleague2 = c2;\n\n        c1.Send(<span class=\"hljs-string\">\"Hello\"<\/span>);\n        c2.Send(<span class=\"hljs-string\">\"Hi\"<\/span>);\n\n        c1.Send(<span class=\"hljs-string\">\"Bye\"<\/span>);\n        c2.Send(<span class=\"hljs-string\">\"Bye bye\"<\/span>);\n\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">C# Mediator pattern variant<\/h2>\n\n\n\n<p>The following provides a variant of the Mediator pattern but in a more elegant way:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">MediatorPattern<\/span>;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Mediator<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message, Colleague colleague<\/span>)<\/span>;\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Colleague<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> Mediator? Mediator { <span class=\"hljs-keyword\">set<\/span>; <span class=\"hljs-keyword\">get<\/span>;}\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span> =&gt; Mediator?.Send(message, <span class=\"hljs-keyword\">this<\/span>);\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Receive<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span>;\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Colleague1<\/span> : <span class=\"hljs-title\">Colleague<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Receive<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span> =&gt; Console.WriteLine(<span class=\"hljs-string\">$\"Colleague1 received <span class=\"hljs-subst\">{message}<\/span>\"<\/span>);\n}\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Colleague2<\/span> : <span class=\"hljs-title\">Colleague<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Receive<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span> =&gt; Console.WriteLine(<span class=\"hljs-string\">$\"Colleague2 received <span class=\"hljs-subst\">{message}<\/span>\"<\/span>);\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteMediator<\/span> : <span class=\"hljs-title\">Mediator<\/span>\n{\n\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> List&lt;Colleague&gt; _colleagues = <span class=\"hljs-keyword\">new<\/span>();\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Register<\/span>(<span class=\"hljs-params\">Colleague colleague<\/span>)<\/span>\n    {\n        colleague.Mediator = <span class=\"hljs-keyword\">this<\/span>;\n        _colleagues.Add(colleague);\n    }\n\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message, Colleague receiver<\/span>)<\/span>\n    {\n        <span class=\"hljs-comment\">\/\/ Send a message from the list of colleagues,<\/span>\n        <span class=\"hljs-comment\">\/\/ which are not receiver, to the receiver<\/span>\n        _colleagues\n                .Where(c =&gt; c != receiver)\n                .ToList()\n                .ForEach(c =&gt; c.Receive(message));\n    }\n}\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Run<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> mediator = <span class=\"hljs-keyword\">new<\/span> ConcreteMediator();\n        <span class=\"hljs-keyword\">var<\/span> c1 = <span class=\"hljs-keyword\">new<\/span> Colleague1();\n        <span class=\"hljs-keyword\">var<\/span> c2 = <span class=\"hljs-keyword\">new<\/span> Colleague2();\n\n        mediator.Register(c1);\n        mediator.Register(c2);\n\n        c1.Send(<span class=\"hljs-string\">\"Hello\"<\/span>);\n        c2.Send(<span class=\"hljs-string\">\"Hi\"<\/span>);\n\n        c1.Send(<span class=\"hljs-string\">\"Bye\"<\/span>);\n        c2.Send(<span class=\"hljs-string\">\"Bye bye\"<\/span>);\n\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In this implementation:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <code>Colleague<\/code> class has a <code>Mediator<\/code> property so that you can set the mediator object.<\/li>\n\n\n\n<li>The <code>ConcreteMediator<\/code> class maintains a list of <code>Colleague<\/code> objects instead of referring to <code>Colleague1<\/code> and <code>Colleague2<\/code> directly.<\/li>\n\n\n\n<li>The <code>Register()<\/code> method of <code>ConcreteMediator<\/code> class adds a <code>Colleague<\/code> to a <code>Colleague<\/code> list.<\/li>\n\n\n\n<li>The <code>Send()<\/code> method sends a message from a list of colleagues except the receiver (colleague) to the receiver (colleague)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Mediator pattern in .NET<\/h2>\n\n\n\n<p>The <a href=\"https:\/\/github.com\/jbogard\/MediatR\" target=\"_blank\" rel=\"noreferrer noopener\">MediatR<\/a> is a package that is a simple mediator implementation in . NET. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use the C# Mediator pattern to encapsulate object interaction with loose coupling.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"1679\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-mediator-pattern\/\"\n\t\t\t\tdata-post-title=\"C# Mediator Pattern\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"1679\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-mediator-pattern\/\"\n\t\t\t\tdata-post-title=\"C# Mediator Pattern\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\n\t\t\t<button class=\"btn btn-primary wth-btn-submit\">Send<\/button>\n\t\t\t<button class=\"btn wth-btn-cancel\">Cancel<\/button>\n\t\t\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this tutorial, you&#8217;ll learn about the C# Mediator pattern to encapsulate object interaction with loose coupling.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1441,"menu_order":14,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1679","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1679","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/comments?post=1679"}],"version-history":[{"count":5,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1679\/revisions"}],"predecessor-version":[{"id":2477,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1679\/revisions\/2477"}],"up":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1441"}],"wp:attachment":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/media?parent=1679"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}