/* * ПАТТЕРНЫ ПОВЕДЕНИЯ * * Глава_3: Фабричный метод(виртуальный конструктор) * * - определяет объект, инкапсулирующий способ взаимодействия множества объектов. * - это клей, связывающий несколько независимых классов между собой. * Он избавляет классы от необходимости ссылаться друг на друга, * позволяя тем самым их независимо изменять и анализировать */ /// /// Посредники /// Предоставляет интерфейс для организации /// процесса по обмену информацией между объектами типа Colleague. /// abstract class Mediator { public abstract void Send(string message, Colleague colleague); } /// /// Конкретный посредник /// Реализует алгоритм взаимодействия между объектами-коллегами /// 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); } } } /// /// Коллеги /// Предоставляет интерфейс для организации процесса /// взаимодействия объектов-коллег с объектом типа Mediator. /// abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; //передаем ссылку на абстрактный класс посредника } } /// /// Фермер /// Каждый объект-коллега знает только об объекте-медиаторе. /// Все объекты-коллеги обмениваются информацией /// только через посредника (медиатора). /// 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); } } /// /// Завод /// 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); } } /// /// Магазин /// 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(); } }