Visitor Pattern

  • 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.
				
					
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");
        }
    }

}

				
			
				
					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");
        }
    }
}

				
			
				
					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");
        }
    }
}

				
			
				
					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());





				
			

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

Leave a Comment