1. 程式人生 > >訪問者模式的分析、結構圖及基本代碼

訪問者模式的分析、結構圖及基本代碼

att sun 設計 type() sys ont public family for



之前我對全部的23種設計模式作了一個小總結。如今我們來對每一種設計模式作具體的分析。首先是訪問者模式:

定義:表示一個作用於某對象結構中的各元素的操作。它可使你能夠在不改變各元素的類的前提下定義作用於這些元素的新操作。
適用地方:訪問者模式的目的是要把處理從數據結構分離出來。非常多系統能夠依照算法和數據結構分開,假設這種系統有比較穩定的數據結構。又有易於變化的算法的話。使用訪問者模式就是比較合適的,由於訪問者模式使得算法操作的添加變得easy。
優缺點:訪問者模式的長處就是添加新的操作非常easy,由於添加新的操作就意味著添加一個新的訪問者。

缺點就是使添加新的數據結構變得困難了。


結構圖:

技術分享
基本代碼:

using System;
using System.Collections.Generic;
using System.Text;

namespace 訪問者模式
{
class Program
{
static void Main(string[] args)
{
ObjectStructure o = new ObjectStructure();
o.Attach(new ConcreteElementA());
o.Attach(new ConcreteElementB());

ConcreteVisitor1 v1 = new ConcreteVisitor1();
ConcreteVisitor2 v2 = new ConcreteVisitor2();

o.Accept(v1);
o.Accept(v2);

Console.Read();
}
}

abstract class Visitor
{
public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);

public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
}

class ConcreteVisitor1 : Visitor
{
public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
{
Console.WriteLine("{0}被{1}訪問", concreteElementA.GetType().Name, this.GetType().Name);
}

public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
{
Console.WriteLine("{0}被{1}訪問", concreteElementB.GetType().Name, this.GetType().Name);
}
}

class ConcreteVisitor2 : Visitor
{
public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
{
Console.WriteLine("{0}被{1}訪問", concreteElementA.GetType().Name, this.GetType().Name);
}

public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
{
Console.WriteLine("{0}被{1}訪問", concreteElementB.GetType().Name, this.GetType().Name);
}
}

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

class ConcreteElementA : Element
{
public override void Accept(Visitor visitor)
{
visitor.VisitConcreteElementA(this);
}

public void OperationA()
{ }
}

class ConcreteElementB : Element
{
public override void Accept(Visitor visitor)
{
visitor.VisitConcreteElementB(this);
}

public void OperationB()
{ }
}

class ObjectStructure
{
private IList<Element> elements = new List<Element>();

public void Attach(Element element)
{
elements.Add(element);
}

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

public void Accept(Visitor visitor)
{
foreach (Element e in elements)
{
e.Accept(visitor);
}
}
}
}

訪問者模式的分析、結構圖及基本代碼