访问者模式
访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
这个描述比较晦涩,啥是对象结构,它的各元素又是啥。
我们先来看下访问者模式的类图:
这个例子是一个关于企业用户和个人用户的例子,概念中的各元素在这里指的就是他俩,对象结构指的是上图的ObjectStructure,这样的设计就会在不改变企业用户和个人用户的前提下为这俩类增加或直接修改了它们的方法(在不改变各元素的类的前提下定义作用于这些元素的新操作)。
新操作就是在具体的访问者对象里实现的,上图里就是ServiceRequestVisitor服务请求和PredilectionAnalyzeVisitor偏好分析。
访问者模式能给一系列对象透明地添加新功能,从而避免在维护期间对这一系列对象进行修改,而且还能变相实现复用访问者所具有的功能。
访问者对象有其适用的范围,比如上述例子中,有企业用户和个人用户,并且一般很难再增加其他类型的用户(对象结构很少变动),试想如果再增加一个某某用户,是不是所有访问者对象都要再增加一个方法。
如果对象结构很少变动,但是需要经常给对象结构中的元素定义新的操作,可以使用访问者模式。
如果想对一个对象结构中的各个元素进行很多不同的且不相关的操作,为了避免这些操作使类变得杂乱,可以使用访问者模式把这些操作分散到不同的访问者对象中去,每一个访问者对象实现同一类功能。
客户端代码:
public class client { public static void man(string[] args) { //创建ObjectStructure ObjectStructure os=new ObjectStructure(); //向对象结构中加入元素 Customer cm1=new EnterpriseCustomer(); os.addElement(cm1); Customer cm2=new PersonalCustomer(); os.addElement(cm2); //构建不同的访问者对象 //客户请求 ServiceRequestVisitor visitor1=new ServiceRequestVisitor(); //执行客户请求新操作 os.handleRequest(visitor1); //偏好分析 PredilectionAnalyzeVisitor visitor2=new PredilectionAnalyzeVisitor(); os.handleRequest(visitor2); } }
对象结构的handleRequest方法
public void handleRequest(Visitor visitor) { //循环对象结构中的元素,接受访问 for(Customer cm:col) { cm.accept(visitor); } }
元素的accept方法
public class EnterpriseCustomer extends Customer { public void accept(Visitor visitor) { //回调访问者对象的相应方法 visitor.visitorEnterpriseCustomer(this); } }
注意visitorEnterpriseCustomer方法中传入的this,这使得Visitor对象中可以访问EnterpriseCustomer对象的内容
Visitor的新操作方法
public class ServiceRequestVisitor implements Visitor { public void visitEnterpriseCustomer(EnterpriseCustomer ec) { //企业客户提出的具体服务请求 ec.getName(); } public void visitPersonalCustomer(PersonalCustomer pc) { //个人客户提出的具体服务请求 pc.getName(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2015-07-11 观察者模式