(二十四)、设计模式 之 访问者模式(Visitor)

(二十四)、设计模式 之 访问者模式(Visitor)

 

 

1、简介

定义: 访问者模式(Visitor)是行为模式, 在不改变类的结构的前提下,为类添加新的功能。
有些朋友可能会想起装饰模式,装饰模式可以实现为一个对象透明地添加功能,但装饰模式基本上是在现有功能的基础之上进行功能添加,实际上是对现有功能的加强或者改造,并不是在现有功能不改动的情况下,为对象添加新的功能。

 

2、访问者模式的结构说明

首先需要定义一个接口来代表要新加入的功能,把它称作访问者,访问谁呢?  当然是访问需要被扩展新功能的类了。既然是访问,不能空手而去吧,这些访问者在进行访
问的时候,就会携带新的功能。也就是说,访问者携带着需要添加的新的功能去访问对象结构中的对象,就相当于给对象结构中的对象添加了新的功能。

  • 抽象的访问者(Visitor): 定义了需要访问的对象的相关接口。
  • 具体的访问者实现对象(ConcreteVisitor): 实现要真正被添加到对象结构中的功能。
  • 被访问者的顶层接口(AbstractElement): 定义接受访问的操作。通常是一个accept()方法,被接受的访问者对象作为accept()方法的参数。
  • 被访问对象的具体实现(ConcreteElement): 通常会回调访问者的真实功能,同时开放自身的数据供访问者使用。

 

3、实现代码

复制代码
/**
 * @Author
 * @ClassName AbstractElement
 * @Description 抽象元素--被访问的元素的抽象
 * @Date 2023/12/20 22:46
 * @Version 1.0
 */
public abstract class AbstractElement {

    /**
     * 接受访问者的访问
     *
     * @param visitor 具体的访问者
     */
    public abstract void accept(Visitor visitor);
}


/**
 * @Author
 * @ClassName ConcreteElementA
 * @Description 具体的元素实现对象
 * @Date 2023/12/20 22:49
 * @Version 1.0
 */
public class ConcreteElement extends AbstractElement{
    @Override
    public void accept(Visitor visitor) {
        visitor.visitorObject(this);
    }

    /**
     * 对象A 中已经存在的功能
     */
    public void operation(){
        // ...doSomething
    }
}


/**
 * @Author
 * @ClassName visitor
 * @Description 抽象访问者
 * @Date 2023/12/20 22:44
 * @Version 1.0
 */
public interface Visitor {

    /**
     * 访问对象
     * @param concreteElement 需要被扩展功能的对象
     */
    public void visitorObject(ConcreteElement concreteElement);
}


/**
 * @Author
 * @ClassName ConcreteVisitor
 * @Description 具体的访问者,在这儿扩展需要被访问的元素的功能
 * @Date 2023/12/20 22:54
 * @Version 1.0
 */
public class ConcreteVisitor implements Visitor{
    @Override
    public void visitorObject(ConcreteElement concreteElement) {
      // 访问concreteElement, 并扩展concreteElement的功能
    }
}
复制代码

 

posted @   邓维-java  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示