fork download
  1. import java.util.*;
  2. import java.lang.*;
  3.  
  4. class Main
  5. {
  6. public static void main (String[] args) throws java.lang.Exception
  7. {
  8. new Main().Run();
  9. }
  10.  
  11. public void Run()
  12. {
  13. Zoo zoo = new Zoo();
  14. CountingVisitor v = new CountingVisitor();
  15. zoo.Accept(v);
  16. v.Summary();
  17. }
  18.  
  19. interface AnimalVisitor
  20. {
  21. void Visit(Giraffe giraffe); // (1)
  22. void Visit(Zebra zebra); // (2)
  23. void Visit(Lion lion); // (3)
  24. void Visit(Penguin penguin); // (4)
  25. }
  26.  
  27. interface VisitableAnimal
  28. {
  29. void Accept(AnimalVisitor visitor);
  30. }
  31.  
  32. class Zoo
  33. {
  34. VisitableAnimal[] animals = new VisitableAnimal[]
  35. {
  36. new Giraffe(),
  37. new Zebra(),
  38. new Lion(),
  39. new Penguin()
  40. };
  41.  
  42. public void Accept(AnimalVisitor visitor)
  43. {
  44. for (VisitableAnimal a : animals)
  45. a.Accept(visitor);
  46. }
  47. }
  48.  
  49. class Giraffe implements VisitableAnimal
  50. {
  51. public void Accept(AnimalVisitor visitor)
  52. {
  53. visitor.Visit(this); // calls (1)
  54. }
  55. }
  56.  
  57. class Zebra implements VisitableAnimal
  58. {
  59. public void Accept(AnimalVisitor visitor)
  60. {
  61. visitor.Visit(this); // calls (2)
  62. }
  63. }
  64.  
  65. class Lion implements VisitableAnimal
  66. {
  67. public void Accept(AnimalVisitor visitor)
  68. {
  69. visitor.Visit(this); // calls (3)
  70. }
  71. }
  72.  
  73. class Penguin implements VisitableAnimal
  74. {
  75. public void Accept(AnimalVisitor visitor)
  76. {
  77. visitor.Visit(this); // calls (4)
  78. }
  79. }
  80.  
  81. class CountingVisitor implements AnimalVisitor
  82. {
  83. int numberOfMammals;
  84. int numberOfBirds;
  85. int numberOfMonochromeAnimals;
  86. public void Summary()
  87. {
  88. System.out.printf("Discovered %d mammals, %d birds\n", numberOfMammals, numberOfBirds);
  89. System.out.printf("Total %d monochrome animals\n", numberOfMonochromeAnimals);
  90. }
  91. public void Visit(Giraffe giraffe)
  92. {
  93. numberOfMammals++;
  94. }
  95. public void Visit(Zebra zebra)
  96. {
  97. numberOfMammals++;
  98. numberOfMonochromeAnimals++;
  99. }
  100. public void Visit(Lion lion)
  101. {
  102. numberOfMammals++;
  103. System.out.println("Lions are NOT scary");
  104. }
  105. public void Visit(Penguin penguin)
  106. {
  107. numberOfBirds++;
  108. numberOfMonochromeAnimals++;
  109. }
  110. }
  111. }
Success #stdin #stdout 0.08s 381248KB
stdin
Standard input is empty
stdout
Lions are NOT scary
Discovered 3 mammals, 1 birds
Total 2 monochrome animals