第28章《访问者模式》

1.定义

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

2.适用场景

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

3.优势

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

4.缺点

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

5.定性

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

6.UML图

这里写图片描述

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值