123 lines
3.6 KiB
C#
123 lines
3.6 KiB
C#
/*
|
||
* ПАТТЕРНЫ ПОВЕДЕНИЯ
|
||
*
|
||
* Глава_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();
|
||
}
|
||
} |