概念:一个作用于某对象结构中的各元素的操作。它使你可用在不改变各元素的类的前提下定义作用于这些元素的新操作。
核心:访问者模式适用于数据结构相对于稳定的系统,Element不能随意扩展,扩展会导致开闭原则违反,导致visitor变更严重

访问者模式

image.png

java代码

  1. public class VisitorTest {
  2. public static void main(String[] args) {
  3. ConcreteVisitor1 v1 = new ConcreteVisitor1();
  4. ConcreteVisitor2 v2 = new ConcreteVisitor2();
  5. Element elementA = new ConcreteElementA();
  6. Element elementB = new ConcreteElementB();
  7. elementA.Accept(v1);
  8. elementB.Accept(v1);
  9. elementB.Accept(v2);
  10. elementB.Accept(v2);
  11. }
  12. }
  13. public abstract class Visitor {
  14. public abstract void VisitConcreteElementA();
  15. public abstract void VisitConcreteElementB();
  16. }
  17. public class ConcreteVisitor1 extends Visitor {
  18. @Override
  19. public void VisitConcreteElementA() {
  20. System.out.println("成功的A是十分骄傲的");
  21. }
  22. @Override
  23. public void VisitConcreteElementB() {
  24. System.out.println("成功的B是十分骄傲的");
  25. }
  26. }
  27. public class ConcreteVisitor2 extends Visitor {
  28. @Override
  29. public void VisitConcreteElementA() {
  30. System.out.println("失败时A是十分沮丧的");
  31. }
  32. @Override
  33. public void VisitConcreteElementB() {
  34. System.out.println("失败时B是平常心的");
  35. }
  36. }
  37. public abstract class Element {
  38. public abstract void Accept(Visitor visitor);
  39. }
  40. public class ConcreteElementA extends Element {
  41. @Override
  42. public void Accept(Visitor visitor) {
  43. visitor.VisitConcreteElementA();;
  44. }
  45. }
  46. public class ConcreteElementB extends Element {
  47. @Override
  48. public void Accept(Visitor visitor) {
  49. visitor.VisitConcreteElementB();
  50. }
  51. }