访问者模式定义.pdfVIP

  • 8
  • 0
  • 约6.38千字
  • 约 5页
  • 2021-11-07 发布于福建
  • 举报
一、引子 对于系统中一个已经完成的类层次结构,我们已经给它提供了满足需求的接口。但是面对新增加的需求, 我们应该怎么做呢?如果这是为数不多的几次变动,而且你不用为了一个需求的调整而将整个类层次结构 统统地修改一遍,那么直接在原有类层次结构上修改也许是个 不错 的主意。 但是往往我们遇到的却是:这样的需求变动也许会不停的发生;更重要的是需求的任何变动可能都要让你 将整个类层次结构修改个底朝天 …… 。这种类似的操作分布在不同的类里面,不是一个好现象,我们要对 这个结构重构一下了。 那么,访问者模式也许是你很好的选择。 二、定义与结构 访问者模式, 顾名思义使用了这个模式后就可以在不修改已有程序结构的前提下, 通过添加额外的 “访问者 ” 来完成对已有代码功能的提升。 《设计 模式》一书对于访问者模式给出的定义为:表示一个作用于某对象结构中的各元素的操作。它使你 可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 从 定义可以看出结构对象是使用访问者 模式必须条件, 而且这个结构对象必须存在遍历自身各个对象的方法。 这便类似于 java 中的 collection 概念 了。 以下是访问者模式的组成结构: 1) 访问者角色 (Visitor ):为该对象结构中具体元素角色声明一个访问操作接口。 该操作接口的名字和参数 标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访 问它。 2) 具体访问者角色( Concrete Visitor ):实现每个由访问者角色( Visitor )声明的操作。 3) 元素角色( Element):定义一个 Accept 操作,它以一个访问者为参数。 4) 具体元素角色( Concrete Element ):实现由元素角色提供的 Accept 操作。 5) 对象结构角色( Object Structure ):这是使用访问者模式必备的角色。它要具备以下特征:能枚举它的元 素;可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个复合(组合模式)或是一个集合, 如一个列表或一个无序集合。 来张类图就能更加清晰的看清访问者模式的结构了。 那么像引言中假想的。我们应该做些什么才能让访问者模式跑起来呢?首先我们要在原有的类层次结构中 添加 accept 方法。然后将这个类层次中的类放到一个对象结构中去。这样再去创建访问者角色 …… 四、双重分派 对了,你在上面的例子中体会到双重分派的实现了没有? 首先在客户程序中将具体访问者模式作为参数传递给具体元素角色 (加亮的地方所示)。这便完成了一 次分派。 进入具体元素角色后,具体元素角 色调 用作为参数的具体访问者模式中的 visitor 方法,同时将自己 (this )作为参数传递进去。具体访问者模式再根据参数的不同来选择方法来执行(加亮的地方所示) 。这 便完成了第二次分派。 五、优缺点及适用情况 先来看下访问者模式的使用能否避免引言中的痛苦。使用了访问者模式以后,对于原来的类层次增加 新的操作,仅仅需要实现一个具体访问者角色就可以了,而 不必修改整个类层次。而且这样符合 “开闭原 则 ”的要求。而且每个具体的访问者角色都对应于一个相关操作,因此如果一个操作的需求有变,那么仅仅 修改一个具 体访问者角色,而不用改动整个类层次。 看来访问者模式确实能够解决我们面临的一些问题。 而且由于访问者模式为我们的系统多提供了一层 “访问者 ”,因此我们可以在访问者中添加一些对元素 角色的额外操作。 但是 “开闭原则 ”的遵循总是片面的。如果系统中的类层次发生了变化,会对访问者模式产生什么样的 影响呢?你必须修改访问者角色和每一个具体访问者角色 …… 看来访问者角色不适合具体元素角色经常发生变化的情况。而且访问者角色要执行与元素角色相关的 操作,就必须让元素角色将自己内部属性暴露出来,而在 j

文档评论(0)

1亿VIP精品文档

相关文档