|
|
|
@ -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<ICarElement> _elements; |
|
|
|
|
|
|
|
|
|
public Car() |
|
|
|
|
{ |
|
|
|
|
_elements = new List<ICarElement>() |
|
|
|
|
{ |
|
|
|
|
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); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |