设计模式之访问者模式
访问者模式
-
访问者模式结构图:
-
示例代码:
// 抽象访问者 public interface Visistor { void checkWork(Engineer engineer); void checkWork(Manager manager); } // 具体访问者boss public class BossVisistor implements Visistor{ @Override public void checkWork(Engineer engineer) { engineer.workProgress(); } @Override public void checkWork(Manager manager) { manager.workProgress(); } } // 具体访问者投资人 public class InvestorsVisistor implements Visistor{ @Override public void checkWork(Engineer engineer) { engineer.workProgress(); } @Override public void checkWork(Manager manager) { manager.workProgress(); } } // 抽象工作者(假定员工只有工程师和项目经理) public abstract class Worker { protected String name; abstract void accept(Visistor visistor); } // 具体工作者工程师 public class Engineer extends Worker{ public Engineer(String name) { this.name = name; } @Override void accept(Visistor visistor) { visistor.checkWork(this); } public void workProgress(){ System.out.println(this.getClass().getSimpleName() + name + "完成工作进度:" + new Random().nextInt(100) + "%"); } } // 具体工作者项目经理 public class Manager extends Worker{ public Manager(String name) { this.name = name; } @Override void accept(Visistor visistor) { visistor.checkWork(this); } public void workProgress(){ System.out.println(this.getClass().getSimpleName() + name + "完成产品设计进度:" + new Random().nextInt(100) + "%"); } } // 容器 public class ObjectStruct { List<Worker> list = new ArrayList<>(); public void accept(Visistor visistor){ list.forEach(a -> a.accept(visistor)); } public void add(Worker worker){ list.add(worker); } public void remove(Worker worker){ list.remove(worker); } } // 测试 public class VisistorTest { public static void main(String[] args) { ObjectStruct objectStruct = new ObjectStruct(); objectStruct.add(new Engineer("张三")); objectStruct.add(new Engineer("李四")); objectStruct.add(new Engineer("王五")); objectStruct.add(new Manager("斯蒂芬")); objectStruct.add(new Manager("詹姆斯")); objectStruct.add(new Manager("约翰逊")); System.out.println("=========老板检查工作进度==========="); objectStruct.accept(new BossVisistor()); System.out.println("=========投资人检查工作进度==========="); objectStruct.accept(new InvestorsVisistor()); } }
-
总结:(举例不是太恰当,主要是为了学习访问者模式)
优点:解偶数据结构与数据操作,符合单一职责原则;
缺点:无法增加元素类型,违背依赖倒置原则.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探