Guest User

Untitled

a guest
Jun 25th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.62 KB | None | 0 0
  1. public interface INode
  2. {
  3. void Visit(INodeVisitor visitor);
  4. }
  5.  
  6. public interface INodeVisitor
  7. {
  8. void VisitContainer(IContainer container);
  9. }
  10.  
  11. public interface IContainer : INode
  12. {
  13. }
  14.  
  15. class Program
  16. {
  17. static void Main(string[] args)
  18. {
  19. ContainerVisitor visitor = new ContainerVisitor();
  20. visitor.VisitContainer(new Container());
  21. }
  22. }
  23.  
  24. public class ContainerVisitor : INodeVisitor
  25. {
  26. public void VisitContainer(IContainer value)
  27. {
  28. Container container = value as Container;
  29. // Do some stuff...
  30. }
  31. }
  32.  
  33. public class Container : IContainer
  34. {
  35. public void Visit(INodeVisitor visitor)
  36. {
  37. visitor.VisitContainer(this);
  38. }
  39. }
  40.  
  41. public class NodeVisitor<T> : INodeVisitor where T : IContainer {
  42. public void VisitContainer(T node) {
  43. var container = node as T;
  44. if ( container != null ) {
  45. VisitTyped(container);
  46. }
  47. }
  48. protected abstract VisitContainerTyped(T container);
  49. }
  50.  
  51. public class ContainerVisitor : NodeVisitor<Container>{
  52. protected override void VisitContainerTyped(Container container){
  53. // Do some stuff...
  54. }
  55. }
  56.  
  57. INodeVisitor visitor = new ContainerVisitor();
  58. visitor.VisitContainer(myBespokeContainer);
  59.  
  60. public interface IContainer : INode
  61. {
  62. void Add(IComponent component);
  63. void Add(IComponent component, string name);
  64. void Remove(IComponent component);
  65. ComponentCollection Components { get; }
  66. }
  67.  
  68. public class ContainerVisitor : INodeVisitor
  69. {
  70. public void VisitContainer(IContainer container)
  71. {
  72. foreach (IComponent component in container.Components)
  73. {
  74. // ...
  75. }
  76. }
  77. }
Add Comment
Please, Sign In to add comment