PatternsCSharpExtraAddons/Patterns/Pattern_6-Посетитель(Visitor)/Program.cs
Dvurechensky a4cd4b4ced 1.0
Main
2024-10-05 09:30:14 +03:00

121 lines
2.8 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.

/*
* ПАТТЕРНЫ ПОВЕДЕНИЯ
*
* Глава_6: Посетитель
*
* - добавление поведения в иерархию объектов, не изменяя их классы
*/
/*
* При добавлении нового поведения в IAnimal нарушаются SOLID принципы,
* для этого и существует подход Visitor чтобы внедрять поведение в конкретные классы наследники
*/
interface IAnimal
{
void Move();
}
class Cat : IAnimal
{
public void Move() => Console.WriteLine("Kradetsy besshumno");
}
class Dog : IAnimal
{
public void Move() => Console.WriteLine("beshit");
}
class Bird : IAnimal
{
public void Move() => Console.WriteLine("fly");
}
interface IVisitor
{
void Make(Cats cat);
void Make(Dogs cat);
void Make(Birds cat);
}
/// <summary>
/// Реализация Visitor №1
/// </summary>
abstract class Animals
{
public abstract void Accept(IVisitor visitor);
}
class Cats : Animals
{
public override void Accept(IVisitor visitor) => visitor.Make(this);
}
class Dogs : Animals
{
public override void Accept(IVisitor visitor) => visitor.Make(this);
}
class Birds : Animals
{
public override void Accept(IVisitor visitor) => visitor.Make(this);
}
class Kiwi : Birds
{
public override void Accept(IVisitor visitor) => visitor.Make(this);
}
class VoiceVisitor : IVisitor
{
public virtual void Make(Dogs dogs) => Console.WriteLine("Gav");
public virtual void Make(Cats cat) => Console.WriteLine("My");
public virtual void Make(Birds cat) => Console.WriteLine("Chirik");
}
/// <summary>
/// Visitor для птички Киви
/// </summary>
class UpdateVoiceVisitor : VoiceVisitor
{
public override void Make(Birds bird)
{
if (bird is Kiwi) Console.WriteLine("Киви что-то там...");
else base.Make(bird);
}
}
class MoveVisitor : IVisitor
{
public void Make(Cats cat) => Console.WriteLine("Kradet");
public void Make(Dogs cat) => Console.WriteLine("Beg");
public void Make(Birds cat) => Console.WriteLine("Fly");
}
class Program
{
public static void Main(string[] args)
{
Dogs dogs = new Dogs();
Cats cats = new Cats();
Birds birds = new Birds();
var voice = new VoiceVisitor();
var move = new MoveVisitor();
dogs.Accept(voice);
cats.Accept(voice);
birds.Accept(voice);
dogs.Accept(move);
cats.Accept(move);
birds.Accept(move);
var updateVoiceVisitor = new UpdateVoiceVisitor();
var kiwi = new Kiwi();
kiwi.Accept(updateVoiceVisitor);
dogs.Accept(updateVoiceVisitor);
cats.Accept(updateVoiceVisitor);
birds.Accept(updateVoiceVisitor);
}
}