diff --git a/Program.cs b/Program.cs index 0aac3ed..e77318e 100644 --- a/Program.cs +++ b/Program.cs @@ -17,6 +17,7 @@ using design_patterns.structural.proxy; using design_patterns.behavioral.chainofresponsability; using design_patterns.behavioral.command; using design_patterns.behavioral.iterator; +using design_patterns.behavioral.mediator; namespace design_patterns { @@ -47,7 +48,8 @@ namespace design_patterns // behavioral // await ChainOfResponsabilitySample.Run(); // await CommandSample.Run(); - await IteratorSample.Run(); + // await IteratorSample.Run(); + await MediatorSample.Run(); } catch (System.Exception ex) { diff --git a/behavioral/mediator/MediatorSample.cs b/behavioral/mediator/MediatorSample.cs new file mode 100644 index 0000000..aa1ebe6 --- /dev/null +++ b/behavioral/mediator/MediatorSample.cs @@ -0,0 +1,118 @@ +using System; +using System.Threading.Tasks; + +namespace design_patterns.behavioral.mediator +{ + /// + /// Mediator is a behavioral design pattern that lets you reduce + /// chaotic dependencies between objects. + /// The pattern restricts direct communications between the objects + /// and forces them to collaborate only via a mediator object. + /// The Mediator makes it easy to modify, extend and reuse + /// individual components because they’re no longer dependent + /// on the dozens of other classes. + /// + /// Use when: + /// - it’s hard to change some of the classes because they are + /// tightly coupled to a bunch of other classes. + /// - you can’t reuse a component in a different program because + /// it’s too dependent on other components. + /// - you find yourself creating tons of component subclasses + /// just to reuse some basic behavior in various contexts. + /// + public class MediatorSample + { + public static async Task Run() + { + Console.WriteLine("Behavioral - Mediator"); + + var comp1 = new Component1(); + var comp2 = new Component2(); + var mediator = new Mediator(comp1, comp2); + + System.Console.WriteLine("First test"); + comp1.Exec11(); + System.Console.WriteLine("Second test"); + comp2.Exec22(); + } + + public interface IMediator { + void Notify(object sender, string eventName); + } + + /// + /// mediator acts as a singleton + /// + public class Mediator : IMediator + { + private readonly Component1 _c1; + private readonly Component2 _c2; + + public Mediator(Component1 c1, Component2 c2) + { + this._c1 = c1; + this._c1.SetMediator(this); + this._c2 = c2; + this._c2.SetMediator(this); + } + + public void Notify(object sender, string eventName) + { + System.Console.WriteLine($"Mediator received event {eventName}"); + switch (eventName) + { + case Component1.EX11: + _c2.Exec21(); + break; + case Component2.EX22: + _c1.Exec12(); + break; + default: + break; + } + } + } + + public class BaseComponent { + protected IMediator _mediator; + + public BaseComponent() : this(null) { } + public BaseComponent(IMediator mediator) + { + this._mediator = mediator; + } + + public void SetMediator (IMediator mediator) { + this._mediator = mediator; + } + } + public class Component1 : BaseComponent { + + public const string EX11 = "EX11"; + public const string EX12 = "EX12"; + + public void Exec11() { + System.Console.WriteLine("Comp1 is doing exec11"); + _mediator.Notify(this, EX11); + } + public void Exec12() { + System.Console.WriteLine("Comp1 is doing exec12"); + _mediator.Notify(this, EX12); + } + } + + public class Component2 : BaseComponent { + public const string EX21 = "EX21"; + public const string EX22 = "EX22"; + + public void Exec21() { + System.Console.WriteLine("Comp2 is doing exec21"); + _mediator.Notify(this, EX21); + } + public void Exec22() { + System.Console.WriteLine("Comp2 is doing exec22"); + _mediator.Notify(this, EX22); + } + } + } +} \ No newline at end of file