Sunday, April 22, 2012

Visitor Design Pattern


(1) IAccept will Accept any IVisitor, which include all object types in signature.
(2) All participating object types implement IAccept with boiler template code visit(this)
(3) Visitors are responsible to implement how to visit a type.

Benefit: Ensure new visitor must know how to visit all types, and these types does not
need to change to allow new visitors.






 

    #region IAccept Universal Visitor

    public interface IVisitor
    {
        // List the universe of objects
        void Visit(Swap sw);
        void Visit(Option o);
        void Visit(Bond b);
    }

    public interface IAccept
    {
        void Accept(IVisitor visitor);
    }

    #endregion

    #region Universal objects  Accept any Visitor(this) --boiler template code

    public class Swap : IAccept
    {
        public void Accept(IVisitor visitor)
        {
            visitor.Visit(this);
        }
    }
    public class Option : IAccept
    {
        public void Accept(IVisitor visitor)
        {
            visitor.Visit(this);
        }
    }
    public class Bond : IAccept
    {
        public void Accept(IVisitor visitor)
        {
            visitor.Visit(this);
        }
    }

    #endregion

#region Risk Visitor -- must know how to visitor any objects

    public class RiskVisitor : IVisitor 
    {
        public void Visit(Swap sw)
        {
            Console.WriteLine("Special works related to Risk of SWAP");
        }

        public void Visit(Option o)
        {
            Console.WriteLine("Special works related to Risk of Option");  
        }

        public void Visit(Bond b)
        {
            Console.WriteLine("Special works related to Risk of Bond");
        }
    }

    #endregion

    #region Pricing Visitor -- must know how to visitor any objects

    public class PricingVisitor : IVisitor
    {
        public void Visit(Swap sw)
        {
            Console.WriteLine("Special works related to Pricing of SWAP");
        }

        public void Visit(Option o)
        {
            Console.WriteLine("Special works related to Pricing of Option");
        }

        public void Visit(Bond b)
        {
            Console.WriteLine("Special works related to Pricing of Bond");
        }
    }

   #endregion


            // (1)  each visitor visit object
            RiskVisitor rv = new RiskVisitor();
            rv.Visit(new Swap());
            rv.Visit(new Option());

            PricingVisitor pv = new PricingVisitor();
            pv.Visit(new Swap());
            pv.Visit(new Option());


            // (2) each object accept any visitor
            Swap sw = new Swap();
            sw.Accept(new RiskVisitor());
            Console.ReadLine();

No comments: