設計模式:訪問者模式

dongyu2013發表於2014-03-22
參考《大話模式》

訪問者模式:表示一個作用於某物件結構中各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
它把資料結構和用作於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由演化
訪問者模式的優點就是增加新的操作很容易,因為增加新的操作就意味著增加一個新的訪問者,訪問者模式將有關的行為集中到一個訪問者物件中。

資料結構的每一個節點都可以接受一個訪問者的呼叫,此節點向訪問者物件傳入節點物件,而訪問者物件則反過來執行節點物件的操作。這樣的過程叫做"雙重分派"。節點呼叫訪問者,將它自己傳入,訪問者則將某演算法針對此節點執行。

雙重分派意味著施加於節點之上的操作是基於訪問者和節點本身的資料型別,而不僅僅是其中的一者。

   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部落格 ” ,連結:http://blog.itpub.net/29012686/viewspace-1127125/,如需轉載,請註明出處,否則將追究法律責任。

相關文章