/* Посетитель Представляет собой операцию, которая будет выполнена над объектами группы классов. Даёт возможность определить новую операцию без изменения кода классов, над которыми эта операция производитcя. */ class Program { public static void Main(string[] args) { #region Пример №1 - базовое var bank = new Bank(); bank.Add(new Person(Name: "Joshua", Number: 1997)); bank.Add(new Company(Name: "Microsoft", Number: 1904)); bank.Accept(new HtmlVisitor()); bank.Accept(new XmlVisitor()); Console.ReadKey(); #endregion } } /// /// Поведение посетителя /// отделяет логику сериализации от классов в которых она применима /// interface IVisitor { void VisitPersonAcc(Person person); void VisitCompanyAcc(Company company); } /// /// Поведение аккаунта /// interface IAccaunt { void Accept(IVisitor visitor); } /// /// Шаблон банка /// class Bank { List Accaunts; public Bank() { Accaunts = new List(); } /// /// Добавить аккаунт /// /// аккаунт public void Add(IAccaunt accaunt) { Accaunts.Add(accaunt); } /// /// Удаллить аккаунт /// /// аккаунт public void Remove(IAccaunt accaunt) { Accaunts.Remove(accaunt); } /// /// Получить доступ к своему аккаунту /// /// пользователь public void Accept(IVisitor visitor) { foreach (var accaunt in Accaunts) accaunt.Accept(visitor); } } /// /// Пользователь /// /// Имя /// Номер record Person(string Name, int Number) : IAccaunt { public void Accept(IVisitor visitor) { visitor.VisitPersonAcc(this); } } /// /// Компания /// /// Имя /// Номер record Company(string Name, int Number) : IAccaunt { public void Accept(IVisitor visitor) { visitor.VisitCompanyAcc(this); } } /// /// HTML сериализатор /// class HtmlVisitor : IVisitor { public void VisitCompanyAcc(Company company) { Console.WriteLine($"[HTML] {company}"); } public void VisitPersonAcc(Person person) { Console.WriteLine($"[HTML] {person}"); } } /// /// XML сериализатор /// class XmlVisitor : IVisitor { public void VisitCompanyAcc(Company company) { Console.WriteLine($"[XML] {company}"); } public void VisitPersonAcc(Person person) { Console.WriteLine($"[XML] {person}"); } }