访问者模式的目的是: 不改变一个层次结构中的类,定义一个新的操作。
实例代码:
abstract class Element
{
public abstract void Accept(IVisitor visitor);
}
class Employee : Element
{
string name;
double income;
int vacationDays;
public Employee(string name, double income,int vacationDays)
{
this.name = name;
this.income = income;
this.vacationDays = vacationDays;
}
public string Name
{
get { return name; }
set { name = value; }
}
public double Income
{
get { return income; }
set { income = value; }
}
public int VacationDays
{
get { return vacationDays; }
set { vacationDays = value; }
}
public override void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}
class Employees
{
private ArrayList employees = new ArrayList();
public void Attach(Employee employee)
{
employees.Add(employee);
}
public void Detach(Employee employee)
{
employees.Remove(employee);
}
public void Accept(IVisitor visitor)
{
foreach (Employee e in employees)
{
e.Accept(visitor);
}
Console.WriteLine();
}
}
interface IVisitor
{
void Visit(Element element);
}
class IncomeVisitor : IVisitor
{
public void Visit(Element element)
{
Employee employee = element as Employee;
employee.Income *= 1.10;
Console.WriteLine("{0} {1}'s new income: {2:C}",employee.GetType().Name, employee.Name,employee.Income);
}
}
class VacationVisitor : IVisitor
{
public void Visit(Element element)
{
Employee employee = element as Employee;
Console.WriteLine("{0} {1}'s new vacation days: {2}",employee.GetType().Name, employee.Name,employee.VacationDays);
}
}
class Clerk : Employee
{
public Clerk() : base("Hank", 25000.0, 14)
{
}
}
class Director : Employee
{
public Director(): base("Elly", 35000.0, 16)
{
}
}
class President : Employee
{
public President() : base("Dick", 45000.0, 21)
{
}
}
class MainApp
{
static void Main()
{
Employees e = new Employees();
e.Attach(new Clerk());
e.Attach(new Director());
e.Attach(new President());
e.Accept(new IncomeVisitor());
e.Accept(new VacationVisitor());
Console.Read();
}
}
实例代码:
abstract class Element
{
public abstract void Accept(IVisitor visitor);
}
class Employee : Element
{
string name;
double income;
int vacationDays;
public Employee(string name, double income,int vacationDays)
{
this.name = name;
this.income = income;
this.vacationDays = vacationDays;
}
public string Name
{
get { return name; }
set { name = value; }
}
public double Income
{
get { return income; }
set { income = value; }
}
public int VacationDays
{
get { return vacationDays; }
set { vacationDays = value; }
}
public override void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}
class Employees
{
private ArrayList employees = new ArrayList();
public void Attach(Employee employee)
{
employees.Add(employee);
}
public void Detach(Employee employee)
{
employees.Remove(employee);
}
public void Accept(IVisitor visitor)
{
foreach (Employee e in employees)
{
e.Accept(visitor);
}
Console.WriteLine();
}
}
interface IVisitor
{
void Visit(Element element);
}
class IncomeVisitor : IVisitor
{
public void Visit(Element element)
{
Employee employee = element as Employee;
employee.Income *= 1.10;
Console.WriteLine("{0} {1}'s new income: {2:C}",employee.GetType().Name, employee.Name,employee.Income);
}
}
class VacationVisitor : IVisitor
{
public void Visit(Element element)
{
Employee employee = element as Employee;
Console.WriteLine("{0} {1}'s new vacation days: {2}",employee.GetType().Name, employee.Name,employee.VacationDays);
}
}
class Clerk : Employee
{
public Clerk() : base("Hank", 25000.0, 14)
{
}
}
class Director : Employee
{
public Director(): base("Elly", 35000.0, 16)
{
}
}
class President : Employee
{
public President() : base("Dick", 45000.0, 21)
{
}
}
class MainApp
{
static void Main()
{
Employees e = new Employees();
e.Attach(new Clerk());
e.Attach(new Director());
e.Attach(new President());
e.Accept(new IncomeVisitor());
e.Accept(new VacationVisitor());
Console.Read();
}
}


浙公网安备 33010602011771号