- Behavioral pattern
- The intent of this pattern is to represent an operation to be performed on the elements of an object structure. Visitors lets us define a new operation without changing the classes of the element on which it operates.
- The more additional requirements come in, the more often these classes need to be changed.
BUILIDING OLD
namespace VisitorPattern
{
public interface IBuildOld
{
void BuildNewHouse(string message);
void Paint();
void SetupInterior();
}
public class BuildNew3BHKHouse : IBuildOld
{
public void BuildNewHouse(string message)
{
Console.WriteLine("Building a 3bhk house");
}
public void Paint()
{
Console.WriteLine("Painting a 3bhk house");
}
public void SetupInterior()
{
Console.WriteLine("doing interior of a 3bhk house");
}
}
public class BuildNew2BHKHouse : IBuildOld
{
public void BuildNewHouse(string message)
{
Console.WriteLine("Building a 2bhk house");
}
public void Paint()
{
Console.WriteLine("Painting a 2bhk house");
}
public void SetupInterior()
{
Console.WriteLine("doing interior of a 2bhk house");
}
}
}
BUILIDING NEW
namespace VisitorPattern
{
public interface IBuildNew
{
void BuildNewHouse(string message);
void Accept(IVisitor visitor);
}
public class BuildNew3BHKHouseNew : IBuildNew
{
public void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
public void BuildNewHouse(string message)
{
Console.WriteLine("Building a 3bhk house");
}
}
public class BuildNew2BHKHouseNew : IBuildNew
{
public void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
public void BuildNewHouse(string message)
{
Console.WriteLine("Building a 2bhk house");
}
}
}
VISITOR
namespace VisitorPattern
{
public interface IVisitor
{
void Visit(IBuildNew buildOld);
}
internal class Paint2BHKVisitor : IVisitor
{
public void Visit(IBuildNew buildOld)
{
Console.WriteLine("Painting the house");
}
}
internal class SetUp2BHKInteriorVisitor : IVisitor
{
public void Visit(IBuildNew buildOld)
{
Console.WriteLine("Interior Set up is done");
}
}
internal class BuildExtraRoomIn2BHKVisitor : IVisitor
{
public void Visit(IBuildNew buildOld)
{
Console.WriteLine("Build extra room in 2bhk");
}
}
internal class BuildAGarrageIn2BHKVisitor : IVisitor
{
public void Visit(IBuildNew buildOld)
{
Console.WriteLine("Build extra Garrage in 2bhk");
}
}
}
PROGRAM.CS
using VisitorPattern;
var buildNew3BHKHouse = new BuildNew3BHKHouse();
buildNew3BHKHouse.BuildNewHouse("3 bhk house");
buildNew3BHKHouse.Paint();
buildNew3BHKHouse.SetupInterior();
Console.WriteLine("----------------------------------");
var buildNew2BHKHouse = new BuildNew2BHKHouse();
buildNew2BHKHouse.BuildNewHouse("2 bhk house");
buildNew2BHKHouse.Paint();
buildNew2BHKHouse.SetupInterior();
//Now if I want to add a garrage to 2bhk house
//I need to modify the interface...
//How visitor patterns solves ?
//IBuildNew - 1) keep the common thing in this interface - BuildNewHouse()
// 2) Accept() - this will accept many visitors
// see the below code
//IVisitor - will have Visit Method
Console.WriteLine("----------------------------------");
//without modifying the interface...I am able to add all the visitors now..
var buildNew2BHKHouseNew = new BuildNew2BHKHouseNew();
buildNew2BHKHouseNew.BuildNewHouse("build 2bhk new house!!");
buildNew2BHKHouseNew.Accept(new Paint2BHKVisitor());
buildNew2BHKHouseNew.Accept(new BuildExtraRoomIn2BHKVisitor());
buildNew2BHKHouseNew.Accept(new SetUp2BHKInteriorVisitor());
buildNew2BHKHouseNew.Accept(new BuildAGarrageIn2BHKVisitor());
OUTPUT
Building a 3bhk house
Painting a 3bhk house
doing interior of a 3bhk house
———————————-
Building a 2bhk house
Painting a 2bhk house
doing interior of a 2bhk house
———————————-
Building a 2bhk house
Painting the house
Build extra room in 2bhk
Interior Set up is done
Build extra Garrage in 2bhk
GITHUB