zoukankan      html  css  js  c++  java
  • 【设计模式】访问者模式

    一、定义

      访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式

    二、结构

    访问者模式的结构

    访问者模式包含以下主要角色。

      1)抽象访问者(Visitor)角色:定义一个访问具体元素的接口,为每个具体元素类对应一个访问操作 visit() ,该操作中的参数类型标识了被访问的具体元素。

      2)具体访问者(ConcreteVisitor)角色:实现抽象访问者角色中声明的各个访问操作,确定访问者访问一个元素时该做什么。

      3)抽象元素(Element)角色:声明一个包含接受操作 accept() 的接口,被接受的访问者对象作为 accept() 方法的参数。  

      4)具体元素(ConcreteElement)角色:实现抽象元素角色提供的 accept() 操作,其方法体通常都是 visitor.visit(this) ,另外具体元素中可能还包含本身业务逻辑的相关操作。 

      5)对象结构(Object Structure)角色:是一个包含元素角色的容器,提供让访问者对象遍历容器中的所有元素的方法,通常由 List、Set、Map 等聚合类实现。

    结构图

      

    三、代码实现

      1 public class Client {
      2     public static void main(String[] args) {
      3         ObjectStructure os = new ObjectStructure();
      4         os.add(new ConcreteElementA());
      5         os.add(new ConcreteElementB());
      6         Visitor visitorA = new ConcreteVisitorA();
      7         os.accept(visitorA);
      8         System.out.println("------------------------");
      9         Visitor visitorB = new ConcreteVisitorB();
     10         os.accept(visitorB);
     11     }
     12 }
     13 
     14 
     15 // 抽象访问者
     16 interface Visitor {
     17     void visit(ConcreteElementA element);
     18 
     19     void visit(ConcreteElementB element);
     20 }
     21 
     22 // 具体访问者A类
     23 class ConcreteVisitorA implements Visitor {
     24 
     25     @Override
     26     public void visit(ConcreteElementA element) {
     27         System.out.println("具体访问者A访问-->" + element.operationA());
     28     }
     29 
     30     @Override
     31     public void visit(ConcreteElementB element) {
     32         System.out.println("具体访问者A访问-->" + element.operationB());
     33 
     34     }
     35 }
     36 
     37 // 具体访问者B类
     38 class ConcreteVisitorB implements Visitor {
     39 
     40     @Override
     41     public void visit(ConcreteElementA element) {
     42         System.out.println("具体访问者B访问-->" + element.operationA());
     43     }
     44 
     45     @Override
     46     public void visit(ConcreteElementB element) {
     47         System.out.println("具体访问者B访问-->" + element.operationB());
     48 
     49     }
     50 }
     51 
     52 // 抽象元素类
     53 interface Element {
     54     void accept(Visitor visitor);
     55 }
     56 
     57 // 具体元素A类
     58 class ConcreteElementA implements Element {
     59 
     60     @Override
     61     public void accept(Visitor visitor) {
     62         visitor.visit(this);
     63     }
     64 
     65     public String operationA() {
     66         return "具体元素A的操作。";
     67     }
     68 }
     69 
     70 // 具体元素B类
     71 class ConcreteElementB implements Element {
     72 
     73     @Override
     74     public void accept(Visitor visitor) {
     75         visitor.visit(this);
     76     }
     77 
     78     public String operationB() {
     79         return "具体元素B的操作。";
     80     }
     81 }
     82 
     83 // 对象结构角色
     84 class ObjectStructure {
     85     private List<Element> list = new ArrayList<>();
     86 
     87     public void accept(Visitor visitor) {
     88         Iterator<Element> iterator = list.iterator();
     89         while (iterator.hasNext()) {
     90             iterator.next().accept(visitor);
     91         }
     92     }
     93 
     94     public void add(Element element) {
     95         list.add(element);
     96     }
     97 
     98     public void remove(Element element) {
     99         list.remove(element);
    100     }
    101 }
  • 相关阅读:
    linux下拼接字符串的代码
    postgresql实现插入数据返回当前的主键ID
    记录一个linux下批处理的代码
    iptables
    mybatis获得执行insert的返回值
    git commit之后撤销
    仿照CIFAR-10数据集格式,制作自己的数据集
    C/C++ 在处理文件所在路径下创建子目录
    C/C++ 图像二进制存储与读取
    C/C++ 文件路径解析
  • 原文地址:https://www.cnblogs.com/h--d/p/14709269.html
Copyright © 2011-2022 走看看