# 访问者模式

属于行为型模式。
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

适用性:

  • 主要目的是将数据结构与数据操作分离。适用于稳定的数据结构,而算法是可以多变的。
  • 访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。
  • 访问者模式的缺点是使增加新的数据结构变得困难了。
  • 访问者模式不常用。因为数据结构不变化的情况很少,所以使用访问者模式的机会不多。

# 类图

img

# 代码

# 访问者

namespace BehavioralPatterns_VisitorPattern
{
    /// <summary>
    /// 访问者
    /// </summary>
    public abstract class Visitor
    {
        /// <summary>
        /// 访问
        /// </summary>
        public abstract void ToVisit();
    }
}
namespace BehavioralPatterns_VisitorPattern
{
    public class Visitor_0 : Visitor
    {
        public override void ToVisit()
        {
            Console.WriteLine("Visitor_0");
        }
    }
}

# 被访问者

namespace BehavioralPatterns_VisitorPattern
{
    /// <summary>
    /// 组件
    /// </summary>
    public abstract class Component
    {
        /// <summary>
        /// 组件的行为
        /// </summary>
        /// <param name="visitor"></param>
        public abstract void Work(Visitor visitor);
    }
}
namespace BehavioralPatterns_VisitorPattern
{
    public class Component_0 : Component
    {
        public override void Work(Visitor visitor)
        {
            visitor.ToVisit();
        }
    }
}

# 管理被访问者

namespace BehavioralPatterns_VisitorPattern
{
    /// <summary>
    /// 组件管理器
    /// </summary>
    public class ComponentManager
    {
        /// <summary>
        /// 储存所有的组件
        /// </summary>
        public List<Component> Components;
        public ComponentManager()
        {
            Components = new List<Component>();
        }
        /// <summary>
        /// 遍历所有的组件
        /// </summary>
        /// <param name="visitor"></param>
        public void Traverse(Visitor visitor)
        {
            foreach (var component in Components)
            {
                component.Work(visitor);
            }
        }
    }
}

# 测试

namespace BehavioralPatterns_VisitorPattern
{
    public class Program
    {
        private static void Main()
        {
            ComponentManager manager = new ComponentManager();
            Component component = new Component_0();
            manager.Components.Add(component);
            Visitor visitor = new Visitor_0();
            manager.Traverse(visitor);
        }
    }
}

运行结果:
Visitor_0