(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();
Sunday, April 22, 2012
Visitor Design Pattern
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment