二十六.行为型设计模式——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.类中定义的对象结构很少改变,但你需要经常地定义处理结构的新操作。
相关文章推荐
- "围观"设计模式(24)--行为型之访问者模式(Visitor Pattern)
- 设计模式(行为型)之访问者模式(Visitor Pattern)
- [设计模式笔记]三. 行为型模式--25. Visitor模式(访问者)对象行为型模式(二)
- 设计模式18:访问者模式【行为型】
- 24种设计模式--访问者模式【Visitor Pattern】
- 设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 访问者模式(Visitor) - Java实现
- PHP设计模式:行为型之访问者(Vistor)
- 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
- 行为型设计模式之访问者模式 重要等级1 难度等级4
- 设计模式24——行为型模式之访问者模式
- 设计模式--行为型--访问者模式
- 设计模式笔记(24)---访问者模式(行为型)
- Java设计模式_(行为型)_访问者模式
- 设计模式23:Visitor 访问者模式(行为型模式)
- Java设计模式(21)行为型:访问者模式
- 设计模式->行为型模式->访问者模式
- 行为型设计模式(职责链模式,命令模式,中介者模式,观察者模式,访问者模式)
- 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
- 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
- 设计模式-行为型之访问者模式