访问者(Visitor)模式

访问者(Visitor)模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。


/*
* 抽象访问者(Visitor)角色:声明了一个或者多个访问操作,形成所有的具体元素角色必须实现的接口。
* 具体访问者(ConcreteVisitor)角色:实现抽象访问者角色所声明的接口,也就是抽象访问者所声明的各个访问操作。
* 抽象节点(Node)角色:声明一个接受操作,接受一个访问者对象作为一个参量。
* 具体节点(Node)角色:实现了抽象元素所规定的接受操作。
* 结构对象(ObiectStructure)角色:有如下的一些责任,可以遍历结构中的所有元素;
    如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素;
    如果需要,可以设计成一个复合对象或者一个聚集,如列(List)或集合(Set)。
*/

               Console.WriteLine("//===============//");

            ObjectStructures o2 = new ObjectStructures();
            o2.Attach(new Man());
            o2.Attach(new Woman());

            Success s = new Success();
            o2.Accept(s);

            //失败时候....



    /// <summary>
    /// 状态抽象类  抽象访问者(Visitor)
    /// </summary>
    public abstract class Action
    {
        //得到男人结论
        public abstract void GetManConclusion(Man man);

        //得到女人结论
        public abstract void GetWomanConclusion(Woman woman);
    }

    /// <summary>
    /// 人抽象类 抽象节点(Node)
    /// </summary>
    public abstract class Person
    {
        //接受
        public abstract void Accept(Action action);
    }

    /// <summary>
    /// 具体访问者 
    /// </summary>
    public class Success : Action
    {
        public override void GetManConclusion(Man man)
        {
            Console.WriteLine("{0} {1} 时,背后多半有一个伟大的女人。", man.GetType().Name,this.GetType().Name);
        }

        public override void GetWomanConclusion(Woman woman)
        {
            Console.WriteLine("{0} {1} 时,背后多半有一个不成功的男人。", woman.GetType().Name, this.GetType().Name);
        }
    }

    public class Man : Person
    {

        public override void Accept(Action action)
        {
            action.GetManConclusion(this);
        }
    }

    public class Woman : Person
    { 
        public override void Accept(Action action)
        {
            action.GetWomanConclusion(this);
        }
    }


    //结构对象(ObiectStructure)角色
    public class ObjectStructures
    { 
        private ArrayList elements = new ArrayList();
        public void Attach(Person element)
        {
            elements.Add(element);
        }

        public void Detach(Person element)
        {
            elements.Remove(element);
        }

        public void Accept(Action visitor)
        {
            foreach (Person e in elements)
                e.Accept(visitor);
        }
    }
原文地址:https://www.cnblogs.com/dragon-L/p/3792849.html