using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
namespace VisitorPatternExample1
{
public class VisitorPatternExample1 : MonoBehaviour
{
void Start()
{
// Setup employee collection
Employees e = new Employees();
e.Attach(new Clerk());
e.Attach(new Director());
e.Attach(new President());
// Employees are 'visited'
e.Accept(new IncomeVisitor());
e.Accept(new VacationVisitor());
e.Accept(new Vacation2Visitor());
}
}
/// <summary>
/// 访问者
/// </summary>
interface IVisitor
{
void Visit(Element element);
}
/// <summary>
///查询收入
/// </summary>
class IncomeVisitor : IVisitor
{
public void Visit(Element element)
{
Employee employee = element as Employee;
// 更改查询内容
employee.Income *= 1.10;
Debug.Log(employee.GetType().Name+" "+ employee.Name+"'的收入: "+employee.Income);
}
}
/// <summary>
/// 查询年龄
/// </summary>
class VacationVisitor : IVisitor
{
public void Visit(Element element)
{
Employee employee = element as Employee;
employee.age += 3;
Debug.Log(employee.GetType().Name + " " + employee.Name + "'的年龄:" + employee.age);
}
}
/// <summary>
/// 查询年龄2
/// </summary>
class Vacation2Visitor : IVisitor
{
public void Visit(Element element)
{
Employee employee = element as Employee;
//内容的确发生变化了
Debug.Log(employee.GetType().Name + " " + employee.Name + "'的年龄:" + employee.age);
}
}
/// <summary>
/// The 'Element' abstract class
/// </summary>
abstract class Element
{
public abstract void Accept(IVisitor visitor);
}
/// <summary>
/// The 'ConcreteElement' class
/// </summary>
class Employee : Element
{
private string _name;
private double _income;
private int _age;
// Constructor
public Employee(string name, double income,
int age)
{
this._name = name;
this._income = income;
this._age = age;
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public double Income
{
get { return _income; }
set { _income = value; }
}
public int age
{
get { return _age; }
set { _age = value; }
}
public override void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}
/// <summary>
/// The 'ObjectStructure' class
/// </summary>
class Employees
{
private List<Employee> _employees = new List<Employee>();
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);
}
}
}
// Three employee types
class Clerk : Employee
{
// Constructor
public Clerk()
: base("Hank", 25000.0, 14)
{
}
}
class Director : Employee
{
// Constructor
public Director()
: base("Elly", 35000.0, 16)
{
}
}
class President : Employee
{
// Constructor
public President()
: base("Dick", 45000.0, 21)
{
}
}
}