天天看點

Net設計模式執行個體之通路者模式(Visitor Pattern)

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

       通路者模式的目的是要把處理從資料結構分離出來。如果系統有比較穩定的資料結構,又有易于變化的算法的話,使用通路者模式是個不錯的選擇,因為通路者模式使的算法操作的增加變的容易。相反,如果系統的資料結構不穩定,易于變化,則此系統就不适合使用通路者模式了。

Visitor:為對象結構中Element的每一個子類聲明一個Visitor操作。

ConcreteVisitor1、ConcreteVisitor2:具體的通路者,實作父類Visitor的操作。每個操作實作算法的一部分,而該算法片段仍是對應與結構中對象的類。

ObjectStructure:枚舉它的元素,可以提供一個高層的接口以允許通路者通路它的元素。

Element:定義一個Accept操作,它以一個通路者為參數。

ConcreteElementA、ConcreteElementB: 具體元素,實作父類Element的方法Accept。

1、通路者抽象類Visitor

public abstract class Visitor

{

    public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);

    public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);

}

2、具體通路者ConcreteVisitor1、ConcreteVisitor2

public class ConcreteVisitor1 : Visitor

    public override void VisitConcreteElementA(ConcreteElementA concreteElementA)

    {

        Console.WriteLine("{0}通路{1}",this.GetType().Name,concreteElementA.GetType().Name);

    }

    public override void VisitConcreteElementB(ConcreteElementB concreteElementB)

        Console.WriteLine("{0}通路{1}", this.GetType().Name, concreteElementB.GetType().Name);

public class ConcreteVisitor2 : Visitor

        Console.WriteLine("{0}通路{1}", this.GetType().Name, concreteElementA.GetType().Name);

3、定義一個Accept操作,它以一個通路者為參數

public abstract class Element

    public abstract void Accept(Visitor visitor);

4、具體元素ConcreteElementA、ConcreteElementB

public class ConcreteElementA : Element

    public override void Accept(Visitor visitor)

        visitor.VisitConcreteElementA(this);

    public void OperationA()

public class ConcreteElementB : Element

        visitor.VisitConcreteElementB(this);

    public void OperationB()

5、對象結構ObjectStructure

public class ObjectStructure

    IList<Element> elements=new List<Element>();

    public void Add(Element e)

        elements.Add(e);

    public void Remove(Element e)

        elements.Remove(e);

    public void Accept(Visitor visitor)

        foreach (Element e in elements)

        {

            e.Accept(visitor);

        }

5、用戶端代碼

static void Main(string[] args)

    ObjectStructure os = new ObjectStructure();

    os.Add(new ConcreteElementA());

    os.Add(new ConcreteElementB());

    ConcreteVisitor1 cv1 = new ConcreteVisitor1();

    ConcreteVisitor2 cv2 = new ConcreteVisitor2();

    os.Accept(cv1);

    os.Accept(cv2);

    Console.Read();

通路者模式表示一個作用于某對象結構中的個元素操作。它使你可以在不改變各元素類的前提下定義作用于這些元素的新操作. 通路者模式的目的是要把處理從資料結構分離出來

本文轉自 靈動生活 51CTO部落格,原文連結:http://blog.51cto.com/smartlife/271360,如需轉載請自行聯系原作者

繼續閱讀