首页 > 其他分享 >(二十六)访问者模式

(二十六)访问者模式

时间:2023-03-30 19:44:54浏览次数:32  
标签:二十六 Visitor void ConcreteElementA 模式 ConcreteElementB public 访问者

1.概述

访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
image

2.示例

Visitor 类,为该对象结构 中ConcreteElement 的每一个类声明一个 Visit 操作。
Visitor.java

public abstract class Visitor {
        public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
        public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}

ConcreteVisitor1 和 ConcreteVisitor2 类,具体访问者,实现每个由 Visitor 声明的操作。每个操作实现算法的一部分,而该算法片断乃是对应于结构中对象的类。
ConcreteVisitor1.java

public class ConcreteVisitor1 extends Visitor {
    @Override
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
        System.out.println(concreteElementA.getClass().getSimpleName() + " 被 " + this.getClass().getSimpleName() + " 访问");
    }

    @Override
    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
        System.out.println(concreteElementB.getClass().getSimpleName() + " 被 " + this.getClass().getSimpleName() + " 访问");
    }
}

ConcreteVisitor2.java

public class ConcreteVisitor2 extends Visitor {
    @Override
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
        System.out.println(concreteElementA.getClass().getSimpleName() + " 被 " + this.getClass().getSimpleName() + " 访问");
    }

    @Override
    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
        System.out.println(concreteElementB.getClass().getSimpleName() + " 被 " + this.getClass().getSimpleName() + " 访问");
    }
}

Element 类,定义一个 Accept 操作,它以一个访问者为参数。
Element.java

public abstract class Element {
    public abstract void accept(Visitor visitor);
}

ConcreteElementA 和 ConcreteElementB 类,具体元素,实现 Accept 操作。
ConcreteElementA.java

public class ConcreteElementA extends Element{
    // 充分利用双分派技术,实现处理与数据结构的分离
    @Override
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementA(this);
    }

    // 其他相关方法
    public void operationA() {}
}

ConcreteElementB.java

public class ConcreteElementB extends Element{
    @Override
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementB(this);
    }

    public void operationB() {}
}

ObjectStructure 类,能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。
ObjectStructure.java

public class ObjectStructure {
    private List<Element> elements = new ArrayList<>();

    public void attach(Element e) {
        elements.add(e);
    }

    public void detach(Element e) {
        elements.remove(e);
    }

    public void accept(Visitor visitor) {
        for (Element element : elements) {
            element.accept(visitor);
        }
    }
}

客户端代码。
Client.java

public class Client {
    public static void main(String[] args) {
        ObjectStructure o =  new ObjectStructure();
        o.attach(new ConcreteElementA());
        o.attach(new ConcreteElementB());

        ConcreteVisitor1 v1 = new ConcreteVisitor1();
        ConcreteVisitor2 v2 = new ConcreteVisitor2();

        o.accept(v1);
        o.accept(v2);
    }
}

输出如下。

ConcreteElementA 被 ConcreteVisitor1 访问
ConcreteElementB 被 ConcreteVisitor1 访问
ConcreteElementA 被 ConcreteVisitor2 访问
ConcreteElementB 被 ConcreteVisitor2 访问

Process finished with exit code 0

3.总结

  • 访问者模式适用于数据结构相对稳定的系统
  • 它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
  • 访问者模式的目的是要把处理从数据结构分离出来。如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。
  • 访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。
  • 缺点是使增加新的数据结构变得困难。

标签:二十六,Visitor,void,ConcreteElementA,模式,ConcreteElementB,public,访问者
From: https://www.cnblogs.com/dalelee/p/17273644.html

相关文章

  • 直线模组常用的驱动模式有哪些?
    直线模组是工业生产中经常用到的直线运动单元,其驱动方式有很多种,但常用的驱动方式通常有两种,一种是滚珠丝杆传动,另一种是同步带传动。滚珠丝杆传动方式的特点是重复定位精度较高,最高精度可达±0.005mm,并且负载一般也比较大,在工业生产中通常被应用于对精度有一定要求的生产过程中。......
  • 单用户模式进centos系统修改root密码
    为虚拟机server重设管理密码1)重启系统,进入recovery恢复模式在读秒时候按e键,找到linux16行,按键盘End末尾添加空格rd.breakconsole=tty0按ctrl+x启动2)......
  • 《无尽之剑2》重大更新 新增ClashMob社交模式
    备受关注的《无尽之剑2》ClashMob模式终于亮相了,已在AppStore上架。ClashMob是一种新游戏模式,这种模式可以多人合作,通过联网和其他玩家一起挑战一个超大型的BOSS。胜利者......
  • 基于stm32mp157 linux开发板ARM裸机开发教程3:Cortex-A7 架构与工作模式(连载中)
    前言:目前针对ARMCortex-A7裸机开发文档及视频进行了二次升级持续更新中,使其内容更加丰富,讲解更加细致,全文所使用的开发平台均为华清远见FS-MP1A开发板(STM32MP157开发板)针对......
  • golang并发编程-模式
    1.Generator9.Queuepackagemainimport("fmt""sync""time")constlimit=4constwork=100funcprocess(wg*sync.WaitGroup,workint,......
  • 前端设计模式——依赖注入模式
    依赖注入模式(DependencyInjectionPattern):允许我们通过将对象的依赖关系从代码中分离出来,从而使代码更加模块化和可重用。在传统的编程模式中,一个对象可能会直接创建或......
  • 行为型:观察者模式
    定义观察者模式属于行为型模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。一种一对多的关系中一称为......
  • C/C++ 思考:策略模式在协议解析中的应用
    目录引出问题传统解析方式策略模式简介UML类图改进1:基于函数的代码结构改进改进2:基于对象的结构改进参考引出问题在基于消息包的通信协议中,通常会通过一个id或命令名来标......
  • 未来没那么"湿",但一定会很"晒":SD模式(二)
    编者按:本文作者为微书架创始人许锡标,此篇文章是探讨SD模式的第二篇,从克莱·舍基的两本书讲起,谈自己对互联网发展的新认识。SD模式就是Share&Discover,各位如果想要就此问题......
  • 非侵入式帮助台指派模式
    ADManagerPlus提供易于使用和安全的独特指派模式。利用其帮助台管理和指派功能,管理员可以授权非管理用户(例如,帮助台技术员、人力资源职员和前线行政人员)执行某些不是必须由......