您的位置:首页 > 其它

访问者模式(Visitor Pattern)

2010-08-26 23:11 381 查看
意图:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

using System;
using ObjectStructure;

// Visitor Pattern - Example    Judith Bishop October 2007
// Sets up an object structure and visits it
// in two ways - for printing and for collecting elements in groups
// using dynamic-dispatch

namespace ObjectStructure {

abstract class IElement {
// Added to make Elements Visitor-ready
public abstract void Accept(IVisitor visitor);
}

class Element : IElement {
public Element Next {get; set;}
public Element Link {get; set;}
public Element () {}
public Element (Element next) {
Next = next;
}
public override void Accept(IVisitor visitor) {
visitor.Visit(this);
}
}

class ElementWithLink : Element {
public ElementWithLink (Element link, Element next) {
Next = next;
Link = link;
}
public override void Accept(IVisitor visitor) {
visitor.Visit(this);
}
}
} // end ObjectStructure

// Visitor interface
interface IVisitor {
void Visit (Element element);
void Visit (ElementWithLink element);
}

// Visitor
class CountVisitor : IVisitor {

public int Count {get; set;}

public void CountElements(Element element) {
element.Accept(this);
if (element.Link!=null) CountElements(element.Link);
if (element.Next!=null) CountElements(element.Next);
}

// Elements with links are not counted
public void Visit(ElementWithLink element) {
Console.WriteLine("Not counting");
}

// Only Elements are counted
public void Visit (Element element) {
Count++;
}
}

// Client
class Client {

static void Main() {
// Set up the object structure
Element objectStructure =
new Element(
new Element(
new ElementWithLink(
new Element(
new Element(
new ElementWithLink(
new Element(null),
new Element(
null)))),
new Element(
new Element(
new Element(null))))));

Console.WriteLine ("Count the Elements");
CountVisitor visitor = new CountVisitor();
visitor.CountElements(objectStructure);
Console.WriteLine("Number of Elements is: "+visitor.Count);
Console.ReadKey();
}
}
/*
Count the As
Found Element
Found Element
Number of elements is: 9
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: