2009年10月15日星期四

Visitor 设计模式

等待处理的对象(Element)提供一个Accept接口来接受不同的访问者(Visitor),让访问者处理自己。比如你在家中(家是处理对象)等待不同的访问者(Visitor):修下水道的,做家务的,做装修的。你只需要用Accept接口接受一下(比如签个字)来访者,剩下的处理就由访问者完成,而你也可以随便更换访问者。这个例子用程序实现如下:

/// Visitor 设计模式.
class MainApp
{
///

/// Entry point into console application.

///


static void Main()
{
//生成Tom的房子,初始化修理,家务,装修次数。
House h1 = new House("Tom's House", 0, 0, 0);

//Tom的房子接受修理工访问者。
h1.Accept(new FixerVisitor());
//Tom的房子接受家务工访问者。
h1.Accept(new HouseworkVisitor());
//Tom的房子接受装修工访问者。
h1.Accept(new DecorateVisitor());

//生成Marry的房子,初始化修理,家务,装修次数。
House h2 = new House("Mary's House", 1, 1, 1);
//Marry的房子接受修理工访问者。
h2.Accept(new FixerVisitor());
//Marry的房子接受家务工访问者。
h2.Accept(new HouseworkVisitor());
//Marry的房子接受装修工访问者。
h2.Accept(new DecorateVisitor());

Console.ReadKey();
}
}

//访问者(装修工,修理工,家务工等)的接口
interface IVisitor
{

void Visit(Element element);

}
//访问者:修理工
class FixerVisitor : IVisitor
{
//访问房子一次,将房子的修理次数加1并打印输出修理后的修理次数。
public void Visit(Element element)
{

House house = element as House;
house.FixCnt++;

Console.WriteLine("{0} 修理下水道的次数是:{1}", house.Name, house.FixCnt);
}
}
//访问者:家务工。
class HouseworkVisitor : IVisitor
{
//访问房子一次,将房子的做家务次数加1并打印输出做家务后的次数。
public void Visit(Element element)
{

House house = element as House;
house.HouseworkCnt++;

Console.WriteLine("{0} 做家务的次数是:{1}", house.Name, house.HouseworkCnt);
}
}
//访问者:装修工
class DecorateVisitor : IVisitor
{
//访问房子一次,将房子装修次数加1并输出装修后的装修次数。
public void Visit(Element element)
{
House house = element as House;
house.DecorateCnt++;

Console.WriteLine("{0} 装修的次数是:{1}", house.Name, house.DecorateCnt);
}
}
//访问元素(房子)的抽象基类
abstract class Element
{
public abstract void Accept(IVisitor visitor);
}

//具体的房子类: Accept接受访问者,并让访问者访问自己Visit(this)。
class House : Element
{

private string _name;

private int _fixCnt; //修下水道次数;

private int _houseworkCnt;//做家务次数;

private int _decorateCnt;//装修次数;

public House(string name, int fixCnt, int houseworkCnt, int decorateCnt)
{
this._name = name;
this._fixCnt = fixCnt;
this._houseworkCnt = houseworkCnt;
this._decorateCnt = decorateCnt;
}
public string Name
{
get { return _name; }
set { _name = value; }
}

public int FixCnt
{
get { return _fixCnt; }
set { _fixCnt = value; }
}

public int HouseworkCnt
{
get { return _houseworkCnt; }
set { _houseworkCnt = value; }
}

public int DecorateCnt
{
get { return _decorateCnt; }
set { _decorateCnt = value; }
}
//接受访问者
public override void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}


这行结果:

Tom's House 修理下水道的次数是:1
Tom's House 做家务的次数是:1
Tom's House 装修的次数是:1
Mary's House 修理下水道的次数是:2
Mary's House 做家务的次数是:2
Mary's House 装修的次数是:2

没有评论:

发表评论