访问者模式

作者:追风剑情 发布于:2016-6-1 18:09 分类:设计模式

访问者模式

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. /************************************************************************/
  5. /* 访问者模式 */
  6. /************************************************************************/
  7. namespace VisitorTest
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. Visitor1 v1 = new Visitor1();
  14.  
  15. List<IPrint> list = new List<IPrint>();
  16. list.Add(new A());
  17. list.Add(new B());
  18.  
  19. for (int i = 0; i < list.Count; i++)
  20. {
  21. IPrint iprint = list[i];
  22. iprint.Print(v1);
  23. }
  24.  
  25. Console.Read();
  26. }
  27. }
  28.  
  29. interface Visitor
  30. {
  31. //利用多态特性进行判断调用,省去了程序员手动判断类型。
  32. void Visit(A a);
  33. void Visit(B b);
  34. }
  35.  
  36. //定义一种访问者
  37. class Visitor1 : Visitor
  38. {
  39. public void Visit(A a)
  40. {
  41. //在不修改A类的前提下,进行额外处理
  42. Console.Write("this is: ");
  43. a.PrintA();
  44. }
  45.  
  46. public void Visit(B b)
  47. {
  48. //在不修改B类的前提下,进行额外处理
  49. Console.Write("Hello ");
  50. b.PrintB();
  51. }
  52. }
  53.  
  54. interface IPrint
  55. {
  56. void Print(Visitor v);
  57. }
  58.  
  59. //实现IPrint接口是为了方便遍历
  60. class A : IPrint
  61. {
  62. public void PrintA()
  63. {
  64. Console.WriteLine("A");
  65. }
  66.  
  67. public void Print(Visitor v)
  68. {
  69. //之所以要让访问者来调用PrintA(),是因为想增加额外操作。
  70. v.Visit(this);
  71. }
  72. }
  73.  
  74. class B : IPrint
  75. {
  76. public void PrintB()
  77. {
  78. Console.WriteLine("B");
  79. }
  80.  
  81. public void Print(Visitor v)
  82. {
  83. v.Visit(this);
  84. }
  85. }
  86. }

 

运行效果

111111111.png

 

标签: Algorithms

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号