简易的设计模式——访问者模式
定义
封装一些作用于某种数据结构中得各个元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新操作。
角色
- Visitor抽象访问者:抽象类,声明访问者可以访问哪些元素。
- ConcreteVisitor 具体访问者:它影响访问者后的具体业务。
- Element 抽象元素:声明接受哪一类访问者的访问。
- ConcreteElement 具体元素:实现accept方法,通常是Visitor.visit(this)
- ObjectStructure 结构对象:元素的产生者。
代码实现
抽象元素 Element.java
public abstract class Element {
//定义业务逻辑
public abstract void dosomething();
//定义接受的访问者
public abstract void accept(IVisitor visitor);
}
具体元素 ConcreteElement1.java
public class ConcreteElement1 extends Element {
@Override
public void dosomething() {
//处理业务
}
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
具体元素 ConcreteElement2.java
public class ConcreteElement2 extends Element {
@Override
public void dosomething() {
//处理业务
}
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
抽象访问者 Visitor.java
public interface IVisitor {
public void visit(ConcreteElement1 concreteElement1);
public void visit(ConcreteElement2 concreteElement2);
}
具体访问者 Visitor.java
public class Visitor implements IVisitor {
@Override
public void visit(ConcreteElement1 concreteElement1) {
concreteElement1.dosomething();
}
@Override
public void visit(ConcreteElement2 concreteElement2) {
concreteElement2.dosomething();
}
}
结构对象 ObjectStruture.java
public class ObjectStruture {
//对象生成器
public static Element createElement(){
Random rand = new Random();
if (rand.nextInt(100) > 50){
return new ConcreteElement1();
}else{
return new ConcreteElement2();
}
}
}
场景类 Client.java
public class Client {
public static void main(String args[]){
for (int i = 0; i < 10; i++) {
Element ele = ObjectStruture.createElement();
ele.accept(new Visitor());
}
}
}
访问者模式的优点
- 符合单一职责的原则:具体元素负责数据的加载,访问者负责报表的展现。
- 优秀的扩展性:这是职责分开导致数据扩展的快捷。
- 灵活性高:可以把多个具体元素的数据提供给一个访问者,由访问者统计数据。
访问者模式的缺点
- 具体元素对访问者公布细节:访问者访问一个类需要知道这个类里面的具体细节。
- 具体元素变得比较困难:具体元素一旦发生变化,那么访问者就需要修改。
- 违背了依赖倒置原则:访问者访问的是具体元素,而不是抽象元素。
使用场景
业务要求遍历多个不同类型的对象,这也是访问者模式的初衷,访问者模式是对迭代器模式的扩展,可以遍历不同的对象,然后执行不同的操作,也就是针对不同的对象,执行不同的操作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?