陈巧倩

设计模式-访问者模式

· 240 words · 2 minutes to read
Categories: CSharp
Tags: Design Pattern

Visitor访问者模式属于行为型设计模式,该模式作用于某对象结构中的各个元素的操作。它可以在不改变各元素的类的前提下定义作用于这些元素的新的操作。

Design Pattern:Visitor 🔗

基本介绍 🔗

构成 🔗

  • Vistor:抽象访问类,定义操作接口,不同的ConcreteElement作为参数,则需要定义不同的接口。
  • ConcreteVistor:具体访问类,实现Vistor定义的操作接口。
  • Element:抽象元素类,定义接受操作的接口,接受受访者作为参数。
  • ConcreteElement:具体元素类,实现Element所规定的接受操作。
  • ObjectStructure:结构对象类,元素类的容器,管理不同的元素类。

优点 🔗

  • 访问者模式使得添加新的操作变得容易。
  • 访问者模式可以访问属于不同的等级结构的成员对象。
  • 访问者模式扩展对象的功能比其他方法(例如继承)更直接。

缺点 🔗

  • 添加ConcreteElement变得负责,Vistor需要对新添加的ConcreteElement进行接口拓展。

实例 🔗

C#中访问者模式的实例,工作室的员工刚刚收到公司,然后我发起了一项大声喊出你工资的行动。

/// <summary>
/// 抽象访问类
/// </summary>
public abstract class Visitor
{
    public abstract void AloudSalary(PlanningElement e);
    public abstract void AloudSalary(EngineerElement e);
    public abstract void AloudSalary(TestingElement e);
}
/// <summary>
/// 具体访问类
/// </summary>
public class AloudVisitor : Visitor
{
    public override void AloudSalary(PlanningElement e)
    {
        Console.WriteLine("我是策划,工资是10000");
    }
    public override void AloudSalary(EngineerElement e)
    {
        Console.WriteLine("我是程序,工资是1000");
    }
    public override void AloudSalary(TestingElement e)
    {
        Console.WriteLine("我是测试,工资是1000");
    }
}
/// <summary>
/// 抽象元素类 - 接受访问
/// </summary>
public abstract class Element
{
    public abstract void Accept(Visitor visitor);
}
/// <summary>
/// 具体元素类 - 策划受访者
/// </summary>
public class PlanningElement : Element
{
    public override void Accept(Visitor visitor)
    {
        visitor.AloudSalary(this);
    }
}
/// <summary>
/// 具体元素类 - 程序受访者
/// </summary>
public class EngineerElement : Element
{
    public override void Accept(Visitor visitor)
    {
        visitor.AloudSalary(this);
    }
}
/// <summary>
/// 具体元素类 - 测试受访者
/// </summary>
public class TestingElement : Element
{
    public override void Accept(Visitor visitor)
    {
        visitor.AloudSalary(this);
    }
}
/// <summary>
/// 结构对象类
/// </summary>
public class Employees
{
    private List<Element> _elements = new List<Element>();
    public void Add(Element e)
    {
        _elements.Add(e);
    }
    public void Remove(Element e)
    {
        _elements.Remove(e);
    }
    public void Accept(Visitor visitor)
    {
        for (int i = 0; i < _elements.Count; i++)
            _elements[i].Accept(visitor);
    }
}

实际运行:

Employees employees = new Employees();
employees.Add(new EngineerElement());
employees.Add(new PlanningElement());
employees.Add(new TestingElement());

AloudVisitor aloudVisitor = new AloudVisitor();
employees.Accept(aloudVisitor);

结论 🔗

搬砖愉快!