PatternsCSharpExtraAddons/Patterns/Pattern_3-Посредник(Mediator)/Program.cs

123 lines
3.6 KiB
C#
Raw Normal View History

2024-10-05 09:30:14 +03:00
/*
* ПАТТЕРНЫ ПОВЕДЕНИЯ
*
* Глава_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();
}
}