访问者模式
访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。
访问者模式可以使得用户在不修改现有系统的情况下扩展系统的功能,为这些不同类型的元素增加新的操作。
访问者模式:表示一个作用于某对象结构中的各个元素的操作。访问者模式让你可以在不改变各元素的类的前提下定义作用于这些元素的新操作
访问者模式有5种角色:
1.Visitor(抽象访问者):为对象结构中的每一个具体元素类声明一个访问操作,从这个操作的名称或参数类型可以知道需要访问的具体元素的类型。
2.ConcreteVisitor(具体访问者):实现抽象访问者声明的操作。
3.Element(抽象元素):一般为抽象类或者接口,声明一个Accept()方法,用于接受访问者的访问操作,该方法通常以一个抽象访问者作为参数。
4.ConcreteElement(具体元素):具体实现Accept()方法,在方法中调用访问者的访问方法以便完成对一个元素的操作。
5.ObjectStructure(对象结构):对象结构是一个元素的集合,用于存放元素对象,并提供了遍历其内部元素的方法。对象结构可以结合组合模式实现。
抽象访问者:
abstract class Visitor
{
public abstract void Visit(ConcreteElementA elementA);
public abstract void Visit(ConcreteElementB elementB);
public void Visit (ConcreteElementC elementC)
{
//元素ConcreteElementC的操作代码
}
}
具体访问者
class ConcreteVisitor:Visitor
{
public override void Visit(ConcreteElementA elementA)
{
//元素ConcreteElementA的操作代码
}
public override void Visit(ConcreteElementB elementB)
{
//元素ConcreteElementB的操作代码
}
}
元素类:
interface Element
{
void Accept(Visitor visitor);
}
具体元素:
class ConcreteElementA:Element
{
public void Accept(Visitor visitor)
{
visitor.Visit(this);
}
public void OperationA()
{
//业务方法
}
}
对象结构:
using System;
using System.Collections.Generic;
class ObjectStructure
{
private List<Element> list = new List<Element>();//定义一个集合用于存储元素对象
//接受访问者的访问操作
public void Accept(Visitor visitor)
{
foreach(Object obj in list)
{
((Element)obj).Accept(visitor);//遍历访问集合中每一个元素
}
}
public void AddElement(Element element)
{
list.Add(element);
}
public void RemoveElement(Element element)
{
list.Remove(element);
}
}