访问者(Visitor)模式 行为型模式
更新: 2023-05-24 11:11:27 字数: 0 字 时长: 0 分钟
在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。
c#
// 访问者模式示例
using System;
// 定义一个抽象元素类,它有一个接受访问者的方法
public abstract class Element
{
public abstract void Accept(Visitor visitor);
}
// 定义两个具体元素类,它们实现了抽象元素类中的方法
public class ConcreteElementA : Element
{
public override void Accept(Visitor visitor)
{
visitor.VisitConcreteElementA(this);
}
}
public class ConcreteElementB : Element
{
public override void Accept(Visitor visitor)
{
visitor.VisitConcreteElementB(this);
}
}
// 定义一个抽象访问者类,它有两个访问具体元素的方法
public abstract class Visitor
{
public abstract void VisitConcreteElementA(ConcreteElementA elementA);
public abstract void VisitConcreteElementB(ConcreteElementB elementB);
}
// 定义两个具体访问者类,它们实现了抽象访问者类中的方法
public class ConcreteVisitor1 : Visitor
{
public override void VisitConcreteElementA(ConcreteElementA elementA)
{
Console.WriteLine("ConcreteVisitor1访问了ConcreteElementA");
}
public override void VisitConcreteElementB(ConcreteElementB elementB)
{
Console.WriteLine("ConcreteVisitor1访问了ConcreteElementB");
}
}
public class ConcreteVisitor2 : Visitor
{
public override void VisitConcreteElementA(ConcreteElementA elementA)
{
Console.WriteLine("ConcreteVisitor2访问了ConcreteElementA");
}
public override void VisitConcreteElementB(ConcreteElementB elementB)
{
Console.WriteLine("ConcreteVisitor2访问了ConcreteElementB");
}
}
// 定义一个对象结构类,它维护了一个元素的集合,并提供了一个接受访问者的方法
public class ObjectStructure
{
private List<Element> elements = new List<Element>();
public void Attach(Element element)
{
elements.Add(element);
}
public void Detach(Element element)
{
elements.Remove(element);
}
public void Accept(Visitor visitor)
{
foreach (Element element in elements)
{
element.Accept(visitor);
}
}
}
class Program
{
static void Main(string[] args)
{
// 创建一个对象结构
ObjectStructure objectStructure = new ObjectStructure();
// 向对象结构中添加元素
objectStructure.Attach(new ConcreteElementA());
objectStructure.Attach(new ConcreteElementB());
// 创建两个具体访问者
ConcreteVisitor1 visitor1 = new ConcreteVisitor1();
ConcreteVisitor2 visitor2 = new ConcreteVisitor2();
// 让两个具体访问者访问对象结构中的元素
objectStructure.Accept(visitor1);
objectStructure.Accept(visitor2);
Console.ReadKey();
}
}