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