ITPub博客

首页 > 应用开发 > IT综合 > 设计模式:访问者模式

设计模式:访问者模式

原创 IT综合 作者:dongyu2013 时间:2014-03-22 08:31:42 0 删除 编辑
参考《大话模式》

访问者模式:表示一个作用于某对象结构中各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
它把数据结构和用作于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由演化
访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问者对象中。

数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象则反过来执行节点对象的操作。这样的过程叫做"双重分派"。节点调用访问者,将它自己传入,访问者则将某算法针对此节点执行。

双重分派意味着施加于节点之上的操作是基于访问者和节点本身的数据类型,而不仅仅是其中的一者。

   public abstract  class Visitor
   {
       public abstract void VisitorOneElement(OneElement one);
       public abstract void VisitorTwoElement(TwoElement Two);
   }

    public class ConcreteOneVisitor : Visitor
    {
        public override void VisitorOneElement(OneElement one)
        {
            Console.WriteLine("{0} visited by {1}",one, this);
        }

        public override void VisitorTwoElement(TwoElement Two)
        {
            Console.WriteLine("{0} visited by {1}", Two, this);
        }
    }
    public class ConcreteTwoVisitor : Visitor
    {
        public override void VisitorOneElement(OneElement one)
        {
            Console.WriteLine("{0} visited by {1}", one, this);
        }

        public override void VisitorTwoElement(TwoElement Two)
        {
            Console.WriteLine("{0} visited by {1}", Two, this);
        }
    }



    public abstract class Element
    {
        public abstract void Accept(Visitor visitor);
    }

    public class OneElement : Element
    {
        public override void Accept(Visitor visitor)
        {
            visitor.VisitorOneElement(this);
        }
    }
    public class TwoElement : Element
    {
        public override void Accept(Visitor visitor)
        {
            visitor.VisitorTwoElement(this);
        }
    }

    //通过该类ObjectStruct把Element和visitor串联

    public class ObjectStruct
    {
        private ArrayList list = new ArrayList();

        public void Attach(Element element)
        {
            list.Add(element);
        }
        public void Detach(Element element)
        {
            list.Remove(element);
        }
        //展示
        public void ObjectAccept(Visitor visitor)
        {
            foreach (Element e in list)
            {
                e.Accept(visitor);
            }
        }
    }

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29012686/viewspace-1127125/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 算法表达式变成
下一篇: 适配器模式
请登录后发表评论 登录
全部评论

注册时间:2013-12-25

  • 博文量
    263
  • 访问量
    238065