关于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();
}
}
}
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(); } } }
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();
        }
    }
}

 

发表回复

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