(二十四)、设计模式 之 访问者模式(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的功能
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)