zoukankan      html  css  js  c++  java
  • 设计模式:visitor

    拜访者模式(visitor)适用于对复杂结构体进行解析的场景。

    所谓复杂结构体,是指包含多个子元素的对象,比如集合,树,图,或者组合对象……。结构体中的每个元素,包括结构体本身实现接口:

    Element{

    //element的信息属性,在此省略

    //专门用于调用visitor的方法

    void accept(visitor)

    }

    所谓解析,是指提取结构体中各个元素的相关信息,组合起来。解析器实现接口:

    Visitor{

    void accept(Element的具体子类);//因为不同的Element子类有不同的信息

    }

    对于client来说,按照如下模式调用:

    visitor= new XXXVisitor;

    Element e=从外界获得的实例;

    e.accept( visitor )

    visitor.getOutput();

    -----------

    为什么需要Visitor模式呢?

    让我们考虑这样的情形,结构体是一个二叉树的结构体,如果不用visitor模式,那么Visitor的visit方法定义如下:

    void visit( Element root){

    if(root != null)

       accept(root);

    if(root.right!=null) visit(root.right);

    if(root.left!=null) visit(root.left);

    }

    这样的话,有两个问题:

    1. Element的内部结构遍历的方法在visitor中实现,如果还有另外一个visitor要实现这个功能,它也需要实现遍历方法,这是一种重复的逻辑;
    2. 如果element的内部结构调整了,visitor1 和visitor2都必须改变。

    -----------

    所以visitor模式就是采用参观者和被参观对象的角色变换,实现了结构体和解析逻辑的解耦合。他适用于对同一个结构体有多种解析方法的情形。

  • 相关阅读:
    CF538H Summer Dichotomy
    CF1558F Strange Sort
    CF429E Points and Segments
    CF986F Oppa Funcan Style Remastered
    [JOI Open 2016] 摩天大楼
    [做题笔记] 浅谈笛卡尔树结构的应用
    CF1383C String Transformation 2
    CF1558E Down Below
    weex打包安卓艰苦之路
    IntelliJ IDEA 推荐15款插件
  • 原文地址:https://www.cnblogs.com/alphablox/p/5346567.html
Copyright © 2011-2022 走看看