Skip to content
百科百科
操作系统
设计模式
算法
题解
java
leetcode
  • 设计模式
    • /设计模式/设计模式 - 单例.md
      • /设计模式/设计模式 - 中介者.md
        • /设计模式/设计模式 - 享元.md
          • /设计模式/设计模式 - 代理.md
            • /设计模式/设计模式 - 原型模式.md
              • /设计模式/设计模式 - 命令.md
                • /设计模式/设计模式 - 备忘录.md
                  • /设计模式/设计模式 - 外观.md
                    • /设计模式/设计模式 - 工厂方法.md
                      • /设计模式/设计模式 - 抽象工厂.md
                        • /设计模式/设计模式 - 桥接.md
                          • /设计模式/设计模式 - 模板方法.md
                            • /设计模式/设计模式 - 状态.md
                              • /设计模式/设计模式 - 生成器.md
                                • /设计模式/设计模式 - 空对象.md
                                  • /设计模式/设计模式 - 策略.md
                                    • /设计模式/设计模式 - 简单工厂.md
                                      • /设计模式/设计模式 - 组合.md
                                        • /设计模式/设计模式 - 装饰.md
                                          • /设计模式/设计模式 - 观察者.md
                                            • /设计模式/设计模式 - 解释器.md
                                              • /设计模式/设计模式 - 访问者.md
                                                • 访问者(Visitor)
                                                  • Intent
                                                    • Class Diagram
                                                      • Implementation
                                                        • JDK
                                                      • /设计模式/设计模式 - 责任链.md
                                                        • /设计模式/设计模式 - 迭代器.md
                                                          • /设计模式/设计模式 - 适配器.md
                                                            • 一、前言
                                                              • 一、概述
                                                                • 设计模式目录

                                                                  2022年5月21日大约 1 分钟

                                                                  此页内容
                                                                  • 访问者(Visitor)
                                                                    • Intent
                                                                    • Class Diagram
                                                                    • Implementation
                                                                    • JDK

                                                                  # 访问者(Visitor)

                                                                  # Intent

                                                                  为一个对象结构(比如组合结构)增加新能力。

                                                                  # Class Diagram

                                                                  • Visitor:访问者,为每一个 ConcreteElement 声明一个 visit 操作
                                                                  • ConcreteVisitor:具体访问者,存储遍历过程中的累计结果
                                                                  • ObjectStructure:对象结构,可以是组合结构,或者是一个集合。

                                                                  img

                                                                  # Implementation

                                                                  public interface Element {
                                                                      void accept(Visitor visitor);
                                                                  }
                                                                  
                                                                  class CustomerGroup {
                                                                  
                                                                      private List<Customer> customers = new ArrayList<>();
                                                                  
                                                                      void accept(Visitor visitor) {
                                                                          for (Customer customer : customers) {
                                                                              customer.accept(visitor);
                                                                          }
                                                                      }
                                                                  
                                                                      void addCustomer(Customer customer) {
                                                                          customers.add(customer);
                                                                      }
                                                                  }
                                                                  
                                                                  public class Customer implements Element {
                                                                  
                                                                      private String name;
                                                                      private List<Order> orders = new ArrayList<>();
                                                                  
                                                                      Customer(String name) {
                                                                          this.name = name;
                                                                      }
                                                                  
                                                                      String getName() {
                                                                          return name;
                                                                      }
                                                                  
                                                                      void addOrder(Order order) {
                                                                          orders.add(order);
                                                                      }
                                                                  
                                                                      public void accept(Visitor visitor) {
                                                                          visitor.visit(this);
                                                                          for (Order order : orders) {
                                                                              order.accept(visitor);
                                                                          }
                                                                      }
                                                                  }
                                                                  
                                                                  public class Order implements Element {
                                                                  
                                                                      private String name;
                                                                      private List<Item> items = new ArrayList();
                                                                  
                                                                      Order(String name) {
                                                                          this.name = name;
                                                                      }
                                                                  
                                                                      Order(String name, String itemName) {
                                                                          this.name = name;
                                                                          this.addItem(new Item(itemName));
                                                                      }
                                                                  
                                                                      String getName() {
                                                                          return name;
                                                                      }
                                                                  
                                                                      void addItem(Item item) {
                                                                          items.add(item);
                                                                      }
                                                                  
                                                                      public void accept(Visitor visitor) {
                                                                          visitor.visit(this);
                                                                  
                                                                          for (Item item : items) {
                                                                              item.accept(visitor);
                                                                          }
                                                                      }
                                                                  }
                                                                  
                                                                  public class Item implements Element {
                                                                  
                                                                      private String name;
                                                                  
                                                                      Item(String name) {
                                                                          this.name = name;
                                                                      }
                                                                  
                                                                      String getName() {
                                                                          return name;
                                                                      }
                                                                  
                                                                      public void accept(Visitor visitor) {
                                                                          visitor.visit(this);
                                                                      }
                                                                  }
                                                                  
                                                                  public interface Visitor {
                                                                      void visit(Customer customer);
                                                                  
                                                                      void visit(Order order);
                                                                  
                                                                      void visit(Item item);
                                                                  }
                                                                  
                                                                  public class GeneralReport implements Visitor {
                                                                  
                                                                      private int customersNo;
                                                                      private int ordersNo;
                                                                      private int itemsNo;
                                                                  
                                                                      public void visit(Customer customer) {
                                                                          System.out.println(customer.getName());
                                                                          customersNo++;
                                                                      }
                                                                  
                                                                      public void visit(Order order) {
                                                                          System.out.println(order.getName());
                                                                          ordersNo++;
                                                                      }
                                                                  
                                                                      public void visit(Item item) {
                                                                          System.out.println(item.getName());
                                                                          itemsNo++;
                                                                      }
                                                                  
                                                                      public void displayResults() {
                                                                          System.out.println("Number of customers: " + customersNo);
                                                                          System.out.println("Number of orders:    " + ordersNo);
                                                                          System.out.println("Number of items:     " + itemsNo);
                                                                      }
                                                                  }
                                                                  
                                                                  public class Client {
                                                                      public static void main(String[] args) {
                                                                          Customer customer1 = new Customer("customer1");
                                                                          customer1.addOrder(new Order("order1", "item1"));
                                                                          customer1.addOrder(new Order("order2", "item1"));
                                                                          customer1.addOrder(new Order("order3", "item1"));
                                                                  
                                                                          Order order = new Order("order_a");
                                                                          order.addItem(new Item("item_a1"));
                                                                          order.addItem(new Item("item_a2"));
                                                                          order.addItem(new Item("item_a3"));
                                                                          Customer customer2 = new Customer("customer2");
                                                                          customer2.addOrder(order);
                                                                  
                                                                          CustomerGroup customers = new CustomerGroup();
                                                                          customers.addCustomer(customer1);
                                                                          customers.addCustomer(customer2);
                                                                  
                                                                          GeneralReport visitor = new GeneralReport();
                                                                          customers.accept(visitor);
                                                                          visitor.displayResults();
                                                                      }
                                                                  }
                                                                  
                                                                  customer1
                                                                  order1
                                                                  item1
                                                                  order2
                                                                  item1
                                                                  order3
                                                                  item1
                                                                  customer2
                                                                  order_a
                                                                  item_a1
                                                                  item_a2
                                                                  item_a3
                                                                  Number of customers: 2
                                                                  Number of orders:    4
                                                                  Number of items:     6
                                                                  

                                                                  # JDK

                                                                  • javax.lang.model.element.Element and javax.lang.model.element.ElementVisitor
                                                                  • javax.lang.model.type.TypeMirror and javax.lang.model.type.TypeVisitor
                                                                  编辑此页open in new window
                                                                  上次编辑于: 2022/5/21 13:08:59
                                                                  贡献者: yzqdev
                                                                  上一页
                                                                  /设计模式/设计模式 - 解释器.md
                                                                  下一页
                                                                  /设计模式/设计模式 - 责任链.md
                                                                  powered by vuepress-theme-home