第28章《访问者模式》

前端之家收集整理的这篇文章主要介绍了第28章《访问者模式》前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

<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图

这里写<a href=图片描述" title="">

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

  • UML图

    这里写<a href=图片描述" title="">

  • 代码结构图

    这里写<a href=图片描述" title="">

  • 代码


    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);
}  


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

猜你在找的设计模式相关文章