设计模式之访问者模式

访问者模式,不太好讲,因为这个不太好举例子,所以印象也不是很深刻。

但是,这个模式它强调是稳定的数据结构,以及经常需要发生变化的操作,操作这种数据结构。

体现在类里面,就是,一个已经做好的类,封装好的东西,现在增加了一种操作,那你怎么办?

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)        定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。


访问者模式的优点:
使得增加新的访问操作变得很容易。如果一些操作依赖于一个复杂的结构对象的话,那么一般而言,增加新的操作会很复杂。而使用访问者模式,增加新的操作就意味着增加一个新的访问者类,因此,变得很容易。
将有关元素对象的访问行为集中到一个访问者对象中,而不是分散到一个个的元素类中。
访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。迭代子只能访问属于同一个类型等级结构的成员对象,而不能访问属于不同等级结构的对象。访问者模式可以做到这一点。
让用户能够在不修改现有类层次结构的情况下,定义该类层次结构的操作
访问者模式的缺点:
增加新的元素类很困难。在访问者模式中,每增加一个新的元素类都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作,违背了“开闭原则”的要求。
破坏封装。访问者模式要求访问者对象访问并调用每一个元素对象的操作,这意味着元素对象有时候必须暴露一些自己的内部操作和内部状态,否则无法供访问者访问。

发布了107 篇原创文章 · 获赞 8 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章