关于C# 设计模式 Visitor 访问者模式

关于C# 设计模式 Visitor 访问者模式

using System;
using System.Collections.Generic;
using System.Text;

///Visitor(访问者)模式 用于表示一个作用于某对象结构中的各元素的操作,在不改变各元素的类的前提下定义作用于这些元素的新操作。
///add by jzh 2007-04-15
namespace DesignPattern
{
    /// <summary>
    /// Visitor(访问者):为该对象结构中ConcreteElement的每一个类声明一个Visit操作。
    /// 该操作的名字和特征标识了发送Visit请求给该访问者的那个类。
    /// 这使得访问者可以确定正被访问元素的具体的类。
    /// 这样访问者就可以通过该元素的特定接口直接访问它。
    /// </summary>
    abstract class Visitor
    {
        abstract public void VisitElementA(ConcreteElementA a);
        abstract public void VisitElementB(ConcreteElementB b);
    }

    /// <summary>
    /// ConcreteVisitor(具体访问者):实现每个由Visitor声明的操作。
    /// 每个操作实现本算法的一部分,而该算法片断乃是对应于结构中对象的类。
    /// ConcreteVisitor为该算法提供了上下文并存储它的局部状态,
    /// 这一状态常常在遍历该结构的过程中累积结果。
    /// </summary>
    class ConcreteVisitor1 : Visitor
    {
        override public void VisitElementA(ConcreteElementA a)
        {
            Console.WriteLine("访问A");
        }

        override public void VisitElementB(ConcreteElementB b)
        {
            Console.WriteLine("访问2");
        }
    }

    /// <summary>
    /// Element(元素):定义一个Accept操作,它以一个访问者为参数。
    /// </summary>
    abstract class Element
    {
        abstract public void Accept(Visitor v);
    }

    /// <summary>
    /// ConcreteElement(具体元素):实现Accept操作,该操作以一个访问者为参数。
    /// </summary>
    class ConcreteElementA : Element
    {
        public Visitor myVisitor;
        override public void Accept(Visitor v)
        {
            myVisitor = v;
        }

        public void OperationA()
        {

        }

        public void DoSomeWork()
        {
            myVisitor.VisitElementA(this);
            Console.WriteLine("做点什么");
        }
    }

    class ConcreteElementB : Element
    {
        override public void Accept(Visitor v)
        {

        }

        public void OperationB()
        {

        }
    }

    public class Client
    {
        public static void Main(string[] args)
        {
            ConcreteElementA eA = new ConcreteElementA();
            ConcreteElementB eB = new ConcreteElementB();
            ConcreteVisitor1 v1 = new ConcreteVisitor1();

            eA.Accept(v1);
            eA.DoSomeWork();

            Console.ReadLine();
        }
    }
}

 

发表回复

您的电子邮箱地址不会被公开。