访问者(Visitor)模式

Eg. Code 1:

 

//  Visitor pattern -- Structural example  
using  System;
using  System.Collections;

//  "Visitor"
abstract   class  Visitor
{
    
// Methods
    abstract public void VisitConcreteElementA(
      ConcreteElementA concreteElementA);
    
abstract public void VisitConcreteElementB(
      ConcreteElementB concreteElementB);
}


//  "ConcreteVisitor1"
class  ConcreteVisitor1 : Visitor
{
    
// Methods
    override public void VisitConcreteElementA(
      ConcreteElementA concreteElementA)
    
{
        Console.WriteLine(
"{0} visited by {1}",
          concreteElementA, 
this);
    }


    
override public void VisitConcreteElementB(
      ConcreteElementB concreteElementB)
    
{
        Console.WriteLine(
"{0} visited by {1}",
          concreteElementB, 
this);
    }

}


//  "ConcreteVisitor2"
class  ConcreteVisitor2 : Visitor
{
    
// Methods
    override public void VisitConcreteElementA(
      ConcreteElementA concreteElementA)
    
{
        Console.WriteLine(
"{0} visited by {1}",
          concreteElementA, 
this);
    }

    
override public void VisitConcreteElementB(
      ConcreteElementB concreteElementB)
    
{
        Console.WriteLine(
"{0} visited by {1}",
          concreteElementB, 
this);
    }

}


//  "Element"
abstract   class  Element
{
    
// Methods
    abstract public void Accept(Visitor visitor);
}


//  "ConcreteElementA"
class  ConcreteElementA : Element
{
    
// Methods
    override public void Accept(Visitor visitor)
    
{
        visitor.VisitConcreteElementA(
this);
    }


    
public void OperationA()
    
{
    }

}


//  "ConcreteElementB"
class  ConcreteElementB : Element
{
    
// Methods
    override public void Accept(Visitor visitor)
    
{
        visitor.VisitConcreteElementB(
this);
    }


    
public void OperationB()
    
{
    }

}


//  "ObjectStructure"
class  ObjectStructure
{
    
// Fields
    private ArrayList elements = new ArrayList();

    
// Methods
    public void Attach(Element element)
    
{
        elements.Add(element);
    }


    
public void Detach(Element element)
    
{
        elements.Remove(element);
    }


    
public void Accept(Visitor visitor)
    
{
        
foreach (Element e in elements)
            e.Accept(visitor);
    }

}


/**/
/// <summary>
/// Client test
/// </summary>

public   class  Client
{
    
public static void Main(string[] args)
    
{
        
// Setup structure
        ObjectStructure o = new ObjectStructure();
        o.Attach(
new ConcreteElementA());
        o.Attach(
new ConcreteElementB());

        
// Create visitor objects
        ConcreteVisitor1 v1 = new ConcreteVisitor1();
        ConcreteVisitor2 v2 
= new ConcreteVisitor2();

        
// Structure accepting visitors
        o.Accept(v1);
        o.Accept(v2);
    }

}

 

Eg. Code 2:

using  System;
using  System.Collections;

//  "Visitor"
abstract   class  Visitor
{
    
// Methods
    abstract public void Visit(Element element);
}


//  "ConcreteVisitor1"
class  IncomeVisitor : Visitor
{
    
// Methods
    public override void Visit(Element element)
    
{
        Employee employee 
= ((Employee)element);

        
// Provide 10% pay raise
        employee.Income *= 1.10;
        Console.WriteLine(
"{0}'s new income: {1:C}",
          employee.Name, employee.Income);
    }

}


//  "ConcreteVisitor2"
class  VacationVisitor : Visitor
{
    
public override void Visit(Element element)
    
{
        Employee employee 
= ((Employee)element);

        
// Provide 3 extra vacation days
        employee.VacationDays += 3;
        Console.WriteLine(
"{0}'s new vacation days: {1}",
          employee.Name, employee.VacationDays);
    }

}


//  "Element"
abstract   class  Element
{
    
// Methods
    abstract public void Accept(Visitor visitor);
}


//  "ConcreteElement"
class  Employee : Element
{
    
// Fields
    string name;
    
double income;
    
int vacationDays;

    
// Constructors
    public Employee(string name, double income,
      
int vacationDays)
    
{
        
this.name = name;
        
this.income = income;
        
this.vacationDays = vacationDays;
    }


    
// Properties
    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; }
    }


    
// Methods
    public override void Accept(Visitor visitor)
    
{
        visitor.Visit(
this);
    }

}


//  "ObjectStructure"
class  Employees
{
    
// Fields
    private ArrayList employees = new ArrayList();

    
// Methods
    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);
    }

}


/**/
/// <summary>
/// VisitorApp test
/// </summary>

public   class  VisitorApp
{
    
public static void Main(string[] args)
    
{
        
// Setup employee collection
        Employees e = new Employees();
        e.Attach(
new Employee("Hank"25000.014));
        e.Attach(
new Employee("Elly"35000.016));
        e.Attach(
new Employee("Dick"45000.021));

        
// Create two visitors
        IncomeVisitor v1 = new IncomeVisitor();
        VacationVisitor v2 
= new VacationVisitor();

        
// Employees are visited
        e.Accept(v1);
        e.Accept(v2);
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值