访问者模式
using System;
using System.Collections.Generic;
using System.Text;
/************************************************************************/
/* 访问者模式 */
/************************************************************************/
namespace VisitorTest
{
class Program
{
static void Main(string[] args)
{
Visitor1 v1 = new Visitor1();
List<IPrint> list = new List<IPrint>();
list.Add(new A());
list.Add(new B());
for (int i = 0; i < list.Count; i++)
{
IPrint iprint = list[i];
iprint.Print(v1);
}
Console.Read();
}
}
interface Visitor
{
//利用多态特性进行判断调用,省去了程序员手动判断类型。
void Visit(A a);
void Visit(B b);
}
//定义一种访问者
class Visitor1 : Visitor
{
public void Visit(A a)
{
//在不修改A类的前提下,进行额外处理
Console.Write("this is: ");
a.PrintA();
}
public void Visit(B b)
{
//在不修改B类的前提下,进行额外处理
Console.Write("Hello ");
b.PrintB();
}
}
interface IPrint
{
void Print(Visitor v);
}
//实现IPrint接口是为了方便遍历
class A : IPrint
{
public void PrintA()
{
Console.WriteLine("A");
}
public void Print(Visitor v)
{
//之所以要让访问者来调用PrintA(),是因为想增加额外操作。
v.Visit(this);
}
}
class B : IPrint
{
public void PrintB()
{
Console.WriteLine("B");
}
public void Print(Visitor v)
{
v.Visit(this);
}
}
}
运行效果