PatternsCSharpExtraAddons/Patterns/Pattern_3-Посредник(Mediator)/Program.cs
Dvurechensky a4cd4b4ced 1.0
Main
2024-10-05 09:30:14 +03:00

123 lines
3.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* ПАТТЕРНЫ ПОВЕДЕНИЯ
*
* Глава_3: Фабричный метод(виртуальный конструктор)
*
* - определяет объект, инкапсулирующий способ взаимодействия множества объектов.
* - это клей, связывающий несколько независимых классов между собой.
* Он избавляет классы от необходимости ссылаться друг на друга,
* позволяя тем самым их независимо изменять и анализировать
*/
/// <summary>
/// Посредники
/// Предоставляет интерфейс для организации
/// процесса по обмену информацией между объектами типа Colleague.
/// </summary>
abstract class Mediator
{
public abstract void Send(string message, Colleague colleague);
}
/// <summary>
/// Конкретный посредник
/// Реализует алгоритм взаимодействия между объектами-коллегами
/// </summary>
class ConcreteMediator : Mediator
{
public Fermer Fermer { get; set; }
public Cannery Cannery { get; set; }
public Shop Shop { get; set; }
public override void Send(string message, Colleague colleague)
{
if(colleague == Fermer)
{
Cannery.MakeKetchup(message);
}
if(colleague == Cannery)
{
Shop.SellKetshup(message);
}
}
}
/// <summary>
/// Коллеги
/// Предоставляет интерфейс для организации процесса
/// взаимодействия объектов-коллег с объектом типа Mediator.
/// </summary>
abstract class Colleague
{
protected Mediator mediator;
public Colleague(Mediator mediator)
{
this.mediator = mediator; //передаем ссылку на абстрактный класс посредника
}
}
/// <summary>
/// Фермер
/// Каждый объект-коллега знает только об объекте-медиаторе.
/// Все объекты-коллеги обмениваются информацией
/// только через посредника (медиатора).
/// </summary>
class Fermer : Colleague
{
public Fermer(Mediator mediator)
: base(mediator) { }
public void GrowTomato()
{
string tomato = "Tomato";
Console.WriteLine($"{this.GetType().Name} raised {tomato}");
mediator.Send(tomato, this);
}
}
/// <summary>
/// Завод
/// </summary>
class Cannery : Colleague
{
public Cannery(Mediator mediator)
: base(mediator) { }
public void MakeKetchup(string message)
{
string ketchup = message + " Ketchup";
Console.WriteLine($"{this.GetType().Name} produced {ketchup}");
mediator.Send(ketchup, this);
}
}
/// <summary>
/// Магазин
/// </summary>
class Shop : Colleague
{
public Shop(Mediator mediator)
: base(mediator) { }
public void SellKetshup(string message)
{
Console.WriteLine($"{this.GetType().Name} sold {message}");
}
}
class Program
{
public static void Main(string[] args)
{
ConcreteMediator mediator = new ConcreteMediator();
var cannery = new Cannery(mediator);
var fermer = new Fermer(mediator);
var shop = new Shop(mediator);
mediator.Cannery = cannery;
mediator.Fermer = fermer;
mediator.Shop = shop;
fermer.GrowTomato();
}
}