概述
表示一个作用于某对象结构中的元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作,它把数据结构和作用于结构上的操作之间的耦合性解脱开,使的操作结合可以相对自由地演化。优点是增加新的操作很容易,因为增加一个新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问对象中。
意图
实现通过统一的接口访问不同类型元素的操作,并且通过这个接口可以增加新的操作而不改变元素的类。
结构图
角色说明:
访问者角色(Visitor):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。
具体访问者角色(Concrete Visitor):实现每个由访问者角色(Visitor)声明的操作。
元素角色(Element):定义一个Accept操作,它以一个访问者为参数。
具体元素角色(Concrete Element):实现由元素角色提供的Accept操作。
对象结构角色(Object Structure):这是使用访问者模式必备的角色。它要具备以下特征:能枚举它的元素;可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个复合(组合模式)或是一个集合,如一个列表或一个无序集合。
生活中例子
比如有一个公园,有一到多个不同的组成部分;该公园存在多个访问者:清洁工A负责打扫公园的A部分,清洁工B负责打扫公园的B部分,公园的管理者负责检点各项事务是否完成,上级领导可以视察公园等等。
用例示例图
在生活中男孩和女孩在恋爱时有着不同的形为,想的问题和方式也是不一样的,我们设计一个访问者模式,用例图如下:
代码设计
先创建Person.cs:
1 |
public interface Person |
2 |
{ |
3 |
string Accept(Visitor visitor); |
4 |
} |
再创建Boy.cs:
01 |
public class Boy : Person |
02 |
{ |
03 |
#region Person 成员 |
04 |
05 |
public string Accept(Visitor visitor) |
06 |
{ |
07 |
return visitor.Visit( this ); |
08 |
} |
09 |
10 |
#endregion |