设计模式系列漫谈之十三 - 访问者模式
有这么一则笑话:
话说有对一年轻夫妇生了一对双胞胎男孩。俩小子长得一模一样,还特别调皮。 平时一般都是妈妈照顾俩小子。可是有一天, 妈妈出差了,晚上爸爸给俩小子胎洗完澡,把他放到床上,催他们快睡觉,小宝就笑起来了:“哥哥都洗两次了,我都还没洗澡呢。”。爸爸:“还好不是喂饭” 。
访问者模式(Visitor)解决方案
访问者模式适用于数据结构相对稳定的系统(两个小孩、负责喂饭和洗澡),它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象则反过来执行节点对象的操作。这样的过程叫做"双重分派"。节点调用访问者,将它自己传入,访问者则将某算法针对此节点执行。
访问者模式涉及到抽象访问者角色、具体访问者角色、抽象节点角色、具体节点角色、结构对象角色以及客户端角色。
抽象访问者(Visitor)角色:声明了一个或者多个访问操作,形成所有的具体元素角色必须实现的接口。如Visitor类
具体访问者(ConcreteVisitor)角色:实现抽象访问者角色所声明的接口,也就是抽象访问者所声明的各个访问操作。 如Wash类、Feed类。
抽象节点(Element)角色:声明一个接受操作,接受一个访问者对象作为一个参量。如Child类。
具体节点(ConcreteElement)角色:实现了抽象元素所规定的接受操作。如Son类。
结构对象(ObiectStructure)角色:可以遍历结构中的所有元素;如ObiectStructure
Visitor类如下:
{
public abstract void Visitor(Son son);
}
{
public override void Visitor(Son son)
{
son.Washed=true;
}
}
{
public override void Visitor(Son son)
{
son.Feeded=true;
}
}
{
public string Name;
public bool Washed=false;
public bool Feeded=false;
public Child(string name)
{
Name=name;
}
public abstract void Accept(Visitor visitor);
}
{
public Son(string name):base(name)
{
}
public override void Accept(Visitor visitor)
{
visitor.Visitor(this);
}
}
{
private List<Child> list=new List<Child>();
public void Add(Child ch)
{
list.Add(ch);
}
public void Remove(Child ch)
{
list.Remove(ch);
}
public void TakeCareofChildren(Visitor visitor)
{
foreach(Child ch in list)
{
ch.Accept(visitor);
}
}
}
{
public static void Main()
{
ObjectStructure obj=new ObjectStructure();
obj.Add(new Son("小宝"));
obj.Add(new Son("大宝"));
Wash w=new Wash();
obj.TakeCareofChildren(w);
Feed f=new Feed();
obj.TakeCareofChildren(f);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述