Skip to content

访问者(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();
    }
}
你觉得这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度