访问者模式,不太好讲,因为这个不太好举例子,所以印象也不是很深刻。
但是,这个模式它强调是稳定的数据结构,以及经常需要发生变化的操作,操作这种数据结构。
体现在类里面,就是,一个已经做好的类,封装好的东西,现在增加了一种操作,那你怎么办?
1,你可以重新写这个类,直接加个操作。可是,这样违背了“开闭原则”,当你这个操作经常发生变化时,就是不可行的。
2.你该把这个操作,单独的写一个类,对操作进行封装。让他作为一个“访问者”可以访问需要进行操作的数据结构。
而你的这个需要操作的数据结构,则需要,有个accept()的方法,来表示,我接受,你们这些访问者。
这样,在不需要改动以前的类的基础上,就增加了这个新的操作。
以下是访问者模式的组成结构:
1) 访问者角色(Visitor):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。
2) 具体访问者角色(Concrete Visitor):实现每个由访问者角色(Visitor)声明的操作。
3) 元素角色(Element):定义一个Accept操作,它以一个访问者为参数。
4) 具体元素角色(Concrete Element):实现由元素角色提供的Accept操作。
5) 对象结构角色(Object Structure):这是使用访问者模式必备的角色。它要具备以下特征:能枚举它的元素;可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个复合(组合模式)或是一个集合,如一个列表或一个无序集合。
《设计模式》一书中给出了访问者模式适用的情况:
1) 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
2) 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。
3) 当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
4) 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。