您的位置:首页 > 其它

二十六.行为型设计模式——Visitor Pattern(访问者模式)

2011-12-13 23:28 399 查看

定义

  说明一个操作执行于一个对象结构的成员(elements)中。访问者样式让你定义一个类的新操作而无须改变它操作的这些成员类。

  UML类图如下:

  View Code

namespace ConsoleApplication
{
//抽象访问者
abstract class Visitor
{
//访问方法,以成员为参数
abstract public void Visit(Element element);
}
//具体访问者——薪水访问者
class IncomeVisitor : Visitor
{
public override void Visit(Element element)
{
Employee employee = ((Employee)element);
employee.Income *= 1.10;
Console.WriteLine("{0}新薪水:{1:C}", employee.Name, employee.Income);
}
}
//具体访问者——假期访问者
class VacationVisitor : Visitor
{
public override void Visit(Element element)
{
Employee employee = ((Employee)element);
employee.VacationDays += 3;
Console.WriteLine("{0}新假期天数:{1}", employee.Name, employee.VacationDays);
}
}
//抽象成员类
abstract class Element
{
//接受访问者方法
abstract public void Accept(Visitor 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(Visitor 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(Visitor visitor)
{
foreach (Employee e in employees)
e.Accept(visitor);
}
}
class Program
{
static void Main(string[] args)
{
Employees e = new Employees();
e.Attach(new Employee("张三", 20000.0, 14));
e.Attach(new Employee("李四", 30000.0, 16));
e.Attach(new Employee("王五", 40000.0, 18));
//生成两个访问者对象
IncomeVisitor v1 = new IncomeVisitor();
VacationVisitor v2 = new VacationVisitor();
//聚合中的员工接受两个访问者对象
e.Accept(v1);
e.Accept(v2);
Console.Read();
}
}
}


优势和缺陷

  Visitor(访问者)模式使得增加新的操作变得容易,它可以收集有关联的方法,而分离没有关联的方法,特别适用于分离因为不同原因而变化的事物,如“在男人中分离出男孩”。但Visitor模式常常要打破对象的封装性,visitor与element需要达成某些共识。

应用情景

  下面的情景很适合应用访问者模式:

  1.一个对象的结构包含多个不同接口的对象,而且需要根据具体对象作不同的处理。

  2.对结构中的对象有很多不同且没有联系的处理,因此需要避免操作将类分离。

  3.类中定义的对象结构很少改变,但你需要经常地定义处理结构的新操作。
  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: