diff --git a/DesignPattern/DesignPattern/Patterns/VisitorPattern.cs b/DesignPattern/DesignPattern/Patterns/VisitorPattern.cs new file mode 100644 index 0000000..7d9f3b9 --- /dev/null +++ b/DesignPattern/DesignPattern/Patterns/VisitorPattern.cs @@ -0,0 +1,101 @@ +namespace DesignPattern.Patterns +{ + internal class VisitorPattern + { + public interface ICarElement + { + void Accept(ICarVisitor visitor); + } + + public class Engine : ICarElement + { + public string Spec => "V4"; + void ICarElement.Accept(ICarVisitor visitor) + { + visitor.Visit(this); + } + } + + public class Body : ICarElement + { + public string Color => "Silver"; + void ICarElement.Accept(ICarVisitor visitor) + { + visitor.Visit(this); + } + } + + public class Wheel : ICarElement + { + public string Type => "P26"; + void ICarElement.Accept(ICarVisitor visitor) + { + visitor.Visit(this); + } + } + + public class Car : ICarElement + { + public string Maker => "BMW"; + private List _elements; + + public Car() + { + _elements = new List() + { + new Engine(), + new Body(), + new Wheel(), + }; + } + + void ICarElement.Accept(ICarVisitor visitor) + { + foreach (var elem in _elements) + { + elem.Accept(visitor); + } + + visitor.Visit(this); + } + } + + public interface ICarVisitor + { + void Visit(Engine elememt); + void Visit(Body elememt); + void Visit(Wheel elememt); + void Visit(Car elememt); + } + + public class CarPrintVisitor : ICarVisitor + { + void ICarVisitor.Visit(Engine elememt) + { + Console.WriteLine(elememt.Spec); + } + + void ICarVisitor.Visit(Body elememt) + { + Console.WriteLine(elememt.Color); + } + + void ICarVisitor.Visit(Wheel elememt) + { + Console.WriteLine(elememt.Type); + } + + void ICarVisitor.Visit(Car elememt) + { + Console.WriteLine(elememt.Maker); + } + } + + public static void Work() + { + ICarElement car = new Car(); + ICarVisitor visitor = new CarPrintVisitor(); + car.Accept(visitor); + } + } +} diff --git a/DesignPattern/DesignPattern/Program.cs b/DesignPattern/DesignPattern/Program.cs index 5952599..fc1e7c8 100644 --- a/DesignPattern/DesignPattern/Program.cs +++ b/DesignPattern/DesignPattern/Program.cs @@ -10,6 +10,8 @@ class Program // CommandClient.Work(); - StateMachinePattern.Work(); + //StateMachinePattern.Work(); + + VisitorPattern.Work(); } }