Click here to Skip to main content
15,881,089 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
Learning Visitor pattern C#: It will be glad if anyone can verify the code which i have written below is following visitor design pattern.

Visitor

C#
namespace Visitorpattern3
{
    interface IVisitor
    {
        void GetLocation(ConcreateElementGetLocation location);
        void GetPackage(ConcreateElementGetPackage package);
        void GetDesignation(ConcreateElementGetDesignation designation);
    }
}





Concrete visitor

C#
namespace Visitorpattern3
{
    class ConcreateVisitorWipro:IVisitor
    {
        public void GetLocation(ConcreateElementGetLocation location)
        {
            Console.WriteLine("WIPRO: Location Bnagalore");
        }

        public void GetPackage(ConcreateElementGetPackage package)
        {
            Console.WriteLine("WIPRO: Package 8 Lakhs");
        }

        public void GetDesignation(ConcreateElementGetDesignation designation)
        {
            Console.WriteLine("WIPRO: Designation Developer");
        }
    }

    class ConcreateVisitorTcs : IVisitor
    {
        public void GetLocation(ConcreateElementGetLocation location)
        {
            Console.WriteLine("TCS: Location UK");
        }

        public void GetPackage(ConcreateElementGetPackage package)
        {
            Console.WriteLine("TCS: Package 20 Lakhs");
        }

        public void GetDesignation(ConcreateElementGetDesignation designation)
        {
            Console.WriteLine("TCS: Designation Tester");
        }
    }

    class ConcreateVisitorInfo : IVisitor
    {
        public void GetLocation(ConcreateElementGetLocation location)
        {
            Console.WriteLine("INFO: Lcation UK");

        }

        public void GetPackage(ConcreateElementGetPackage package)
        {
            Console.WriteLine("INFO: package 10 lakhs");
        }

        public void GetDesignation(ConcreateElementGetDesignation designation)
        {
            Console.WriteLine("INFO: Designation Architect");
        }
    }
}



Element


C#
namespace Visitorpattern3
{
    interface IElement
    {
        void Accept(IVisitor visitor);
    }
}




Concrete element

C#
namespace Visitorpattern3
{
    class ConcreateElementGetLocation:IElement
    {
        public void Accept(IVisitor visitor)
        {
            visitor.GetLocation(this);

        }
    }
    class ConcreateElementGetPackage : IElement
    {
        public void Accept(IVisitor visitor)
        {
           visitor.GetPackage(this);
        }
    }
    class ConcreateElementGetDesignation : IElement
    {
        public void Accept(IVisitor visitor)
        {
            visitor.GetDesignation(this);
        }
    }
}




Program
C#
namespace Visitorpattern3
{
    class Program
    {
        static void Main(string[] args)
        {
            var objlist = new List<IElement>
            {
                new ConcreateElementGetDesignation(),
                new ConcreateElementGetLocation(),
                new ConcreateElementGetPackage()
            };

  


            ConcreateVisitorWipro wipro = new ConcreateVisitorWipro();
            ConcreateVisitorTcs tcs = new ConcreateVisitorTcs();
            ConcreateVisitorInfo info = new ConcreateVisitorInfo();

            foreach (IElement ieleElement in objlist)
            {
                ieleElement.Accept(wipro);
                ieleElement.Accept(tcs);
                ieleElement.Accept(info);
                
            }
          
            

            Console.ReadLine();
        }
    }
}


Is this correct ? If not where i went wrong?
Posted
Updated 16-Feb-15 2:03am
v3
Comments
John C Rayan 16-Feb-15 8:43am    
I would recommend to use one Visitor. Why do you need 3 visitors? Also it is better to use abstract class than interface.
Am Gayathri 16-Feb-15 9:08am    
Thanks for your inputs...
John C Rayan 16-Feb-15 9:26am    
Please look at my code. you might need be looking for something like that. Let me know.
Am Gayathri 17-Feb-15 0:42am    
Thanks.. Actually am learning visitor pattern.

1 solution

C#
class Program
    {
        static void Main(string[] args)
        {


            var objlist = new List<IElement>
            {
                new TcsDesignation(),
                new WiproLocation(),
                new InfoPackage(),
                new InfoDesignation(),
                new TcsLocation(),
                new TcsPackage()
            };




            ITCompanyVisitor visitor = new ITCompanyVisitor();

            foreach (IElement ieleElement in objlist)
            {
                ieleElement.Accept(visitor);

            }


        }
    }



        abstract class Visitor
        {
            public abstract void GetLocation(TcsLocation location);
            public abstract void GetLocation(WiproLocation location);
            public abstract void GetLocation(InfoLocation location);

            public abstract void GetPackage(TcsPackage package);
            public abstract void GetPackage(WiproPackage package);
            public abstract void GetPackage(InfoPackage package);

            public abstract void GetDesignation(TcsDesignation designation);
            public abstract void GetDesignation(WiproDesignation designation);
            public abstract void GetDesignation(InfoDesignation designation);

        }


        class ITCompanyVisitor : Visitor
        {

            void GetLocation(TcsLocation location)
            {
            }
            void GetLocation(WiproLocation location)
            {
            }
            void GetLocation(InfoLocation location)
            {
            }

            void GetPackage(TcsPackage package)
            {
            }
            void GetPackage(WiproPackage package)
            {
            }
            void GetPackage(InfoPackage package)
            {
            }

            void GetDesignation(TcsDesignation designation)
            {
            }
            void GetDesignation(WiproDesignation designation)
            {
            }
            void GetDesignation(InfoDesignation designation)
            {
            }


        }



        interface IElement
        {
            void Accept(Visitor visitor);
        }


        class TcsLocation : IElement
        {
            public void Accept(Visitor visitor)
            {
                visitor.GetLocation(this);

            }
        }
        class TcsPackage : IElement
        {
            public void Accept(Visitor visitor)
            {
                visitor.GetPackage(this);
            }
        }
        class TcsDesignation : IElement
        {
            public void Accept(Visitor visitor)
            {
                visitor.GetDesignation(this);
            }
        }


        class WiproLocation : IElement
        {
            public void Accept(Visitor visitor)
            {
                visitor.GetLocation(this);

            }
        }
        class WiproPackage : IElement
        {
            public void Accept(Visitor visitor)
            {
                visitor.GetPackage(this);
            }
        }
        class WiproDesignation : IElement
        {
            public void Accept(Visitor visitor)
            {
                visitor.GetDesignation(this);
            }
        }

        class InfoLocation : IElement
        {
            public void Accept(Visitor visitor)
            {
                visitor.GetLocation(this);

            }
        }
        class InfoPackage : IElement
        {
            public void Accept(Visitor visitor)
            {
                visitor.GetPackage(this);
            }
        }
        class InfoDesignation : IElement
        {
            public void Accept(Visitor visitor)
            {
                visitor.GetDesignation(this);
            }
        }

}
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900