/// 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
没有评论:
发表评论