加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

第28章《访问者模式》

发布时间:2020-12-13 20:56:33 所属栏目:百科 来源:网络整理
导读:h4 id="1定义"1.定义 表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的前提下定义作用于这些元素的新操作。 h4 id="2适用场景"2.适用场景 适用于数据结构相对稳定,又有易于变化的算法的系统(就是element稳定,visitor经常变化) h4 id

<h4 id="1定义">1.定义

表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的前提下定义作用于这些元素的新操作。

<h4 id="2适用场景">2.适用场景

适用于数据结构相对稳定,又有易于变化的算法的系统(就是element稳定,visitor经常变化)

<h4 id="3优势">3.优势

由于把数据结构和数据结构上的操作进行了解耦,也就是把处理从数据结构中分离出来,使得增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。

<h4 id="4缺点">4.缺点

源于优点,使得增加数据结构变得困难了。

<h4 id="5定性">5.定性

因为数据结构不变化的情况比较难找,所以大多数时候并不需要访问者模式,但是一旦需要访问者模式,那就是真的用它了。

<h4 id="6uml图">6.UML图

这里写图片描述

<h4 id="7例子">7.例子

  • UML图

    这里写图片描述

  • 代码结构图

    这里写图片描述

  • 代码


    package designmodel.chapter28;
    

    /**

    • @Author: cxh

    • @CreateTime: 18/3/15 22:11

    • @ProjectName: JavaBaseTest
      */
      public class ConcreteElementB implements Element {
      @Override
      public void accept(Visitor v) {
      v.visitElementB(this);
      }
      }


   package designmodel.chapter28;

/**

  • @Author: cxh

  • @CreateTime: 18/3/15 22:12

  • @ProjectName: JavaBaseTest
    */
    public class ConcreteElementC implements Element {

    @Override
    public void accept(Visitor v) {
    v.visitElementC(this);
    }
    }


package designmodel.chapter28;

/**

  • @Author: cxh
  • @CreateTime: 18/3/15 22:08
  • @ProjectName: JavaBaseTest
    */
    public class ConcreteElmentA implements Element {
    @Override
    public void accept(Visitor v) {
    v.visitElementA(this);
    }
    }

    package designmodel.chapter28;
/**
 * @Author: cxh
 * @CreateTime: 18/3/15 22:14
 * @ProjectName: JavaBaseTest
 */
public class ConcreteVisitor1 implements Visitor {
    @Override
    public void visitElementA(Element a) {
        System.out.println("ConcreteVisitor1 访问 ElementA");
    }

    @Override
    public void visitElementB(Element b) {
        System.out.println("ConcreteVisitor1 访问 ElementB");
    }

    @Override
    public void visitElementC(Element c) {
        System.out.println("ConcreteVisitor1 访问 ElementC");
    }
}  


     package designmodel.chapter28;
/**
 * @Author: cxh
 * @CreateTime: 18/3/15 22:16
 * @ProjectName: JavaBaseTest
 */
public class ConcreteVisitor2 implements Visitor{
    @Override
    public void visitElementA(Element a) {
        System.out.println("ConcreteVisitor2 访问 ElementA");
    }

    @Override
    public void visitElementB(Element b) {
        System.out.println("ConcreteVisitor2 访问 ElementB");
    }

    @Override
    public void visitElementC(Element c) {
        System.out.println("ConcreteVisitor2 访问 ElementC");
    }
}


    package designmodel.chapter28;
/**
 * @Author: cxh
 * @CreateTime: 18/3/15 22:17
 * @ProjectName: JavaBaseTest
 */
public class ConcreteVisitor3 implements Visitor{
    @Override
    public void visitElementA(Element a) {
        System.out.println("ConcreteVisitor3 访问 ElementA");
    }

    @Override
    public void visitElementB(Element b) {
        System.out.println("ConcreteVisitor3 访问 ElementA");
    }

    @Override
    public void visitElementC(Element c) {
        System.out.println("ConcreteVisitor3 访问 ElementA");
    }
}


     package designmodel.chapter28;
/**
 * @Author: cxh
 * @CreateTime: 18/3/15 22:05
 * @ProjectName: JavaBaseTest
 */
public interface Element{
    void accept(Visitor v);
}


    package designmodel.chapter28;
/**
 * @Author: cxh
 * @CreateTime: 18/3/15 22:18
 * @ProjectName: JavaBaseTest
 */
public class Main {
    public static void main(String[] args) {
        ObjectStructure os=new ObjectStructure();

        os.add(new ConcreteElmentA());
        os.add(new ConcreteElementB());
        os.add(new ConcreteElementC());

        Visitor a=new ConcreteVisitor1();
        Visitor b=new ConcreteVisitor2();
        Visitor c=new ConcreteVisitor3();

        //访问开始
        os.deteach(a);
        os.deteach(b);
        os.deteach(c);
    }
}


     package designmodel.chapter28;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: cxh
 * @CreateTime: 18/3/15 22:22
 * @ProjectName: JavaBaseTest
 */
//访问者模式关键设计处
public class ObjectStructure{
    private  List<Element> elements=new ArrayList<>();
    //crud
    public  void add(Element e){
        elements.add(e);
    }
    public  void delete(Element e){
        elements.remove(e);
    }
    //访问每一个元素
    public  void deteach(Visitor vi){
        elements.forEach(e->e.accept(vi));
    }
}


    package designmodel.chapter28;
/**
 * @Author: cxh
 * @CreateTime: 18/3/13 23:13
 * @ProjectName: JavaBaseTest
 */
public interface Visitor {
    void  visitElementA(Element a);
    void  visitElementB(Element b);
    void  visitElementC(Element c);
}  


参考书籍:《大话设计模式》-程杰

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读