访问者模式(Visitor Pattern)

2024-07-12 1341阅读

访问者模式(Visitor Pattern)

定义

访问者模式(Visitor Pattern)

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

该模式的主要思想是将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使得可以在不改变数据结构的前提下添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。

属于行为型模式。


适用场景

  1. 数据结构稳定,作用于数据结构的操作经常发生变化的场景;
  2. 需要数据结构与数据操作分离的场景;
  3. 需要对不同数据类型(元素)进行操作,而不使用分支判断具体类型的场景。

标准示例

  • Visitor(抽象访问者):定义一个访问具体元素的接口,该接口内部包含了对所有具体元素的访问方法。
  • ConcreteVisitor(具体访问者):实现Visitor接口,针对特定类型的元素执行具体访问操作。
  • Element(抽象元素):定义一个接受访问操作的接口,通常包含一个accept()方法,该方法接收一个访问者对象作为参数。
  • ConcreteElement(具体元素):实现了Element接口,存储了实际的数据,并提供接受访问者访问的方法实现。
  • ObjectStructure(对象结构):管理元素的集合,通常包含add、remove等方法以及一个遍历所有元素的accept()方法,该方法接收一个访问者对象作为参数,并遍历所有元素,让每个元素接受访问者的访问。

    访问者模式(Visitor Pattern)

    代码:

    public interface IVisitor {
        void visit(ConcreteElementA element);
        void visit(ConcreteElementB element);
    }
    
    public class ConcreteVisitorA implements IVisitor {
        public void visit(ConcreteElementA element) {
            String result = element.operationA();
            System.out.println( element.getClass().getSimpleName() + " : " + result);
        }
        public void visit(ConcreteElementB element) {
            int result = element.operationB();
            System.out.println( element.getClass().getSimpleName() + ": " + result);
        }
    }
    
    public class ConcreteVisitorB implements IVisitor {
        public void visit(ConcreteElementA element) {
            String result = element.operationA();
            System.out.println(element.getClass().getSimpleName() + ": " + result);
        }
        public void visit(ConcreteElementB element) {
            int result = element.operationB();
            System.out.println( element.getClass().getSimpleName() + ": " + result);
        }
    }
    
    public interface IElement {
        void accept(IVisitor visitor);
    }
    
    public class ConcreteElementA implements IElement {
        public void accept(IVisitor visitor) {
            visitor.visit(this);
        }
        public String operationA() {
            return this.getClass().getSimpleName();
        }
    }
    
    public class ConcreteElementB implements IElement {
        public void accept(IVisitor visitor) {
            visitor.visit(this);
        }
        public int operationB() {
            return new Random().nextInt(10);
        }
    }
    
    public class ObjectStructure {
        private List list = new ArrayList();
        {
            this.list.add(new ConcreteElementA());
            this.list.add(new ConcreteElementB());
        }
        public void accept(IVisitor visitor) {
            for (IElement element : this.list) {
                element.accept(visitor);
            }
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            ObjectStructure objectStructure = new ObjectStructure();	
            IVisitor visitorA = new ConcreteVisitorA();
            objectStructure.accept(visitorA);
            System.out.println("***************************************");
            IVisitor visitorB = new ConcreteVisitorB();
            objectStructure.accept(visitorB);
        }
    }
    

    输出结果:

    ConcreteElementA: ConcreteElementA
    ConcreteElementB: 5
    ***************************************
    ConcreteElementA: ConcreteElementA
    ConcreteElementB: 4
    

    以上就是访问者模式全部内容,感谢阅读!

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]