Objective-C 设计模式-访问者模式 (Visitor)

访问者模式定义

  访问者模式 (Visitor) ,表示一个对象结构中的各元素的操作,它可以在不改变各元素的类的前提下,定义作用于各元素新的操作。

组成角色

  1. Visitor访问者角色,它可以是一个抽象类,或协议。为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。
  2. ConcreteVisitor具体访问者角色,实现Visitor声明的接口。
  3. Element元素角色,定义一个Accept接受访问的操作,它以一个访问者Visitor作为参数。
  4. ConcreteElement具体元素角色,实现元素角色定义的Accept操作接口。
  5. ObjectStructure结构对象角色,这是使用访问者模式必备的角色。它具备以下特性:能枚举它的元素;可以提供一个高层接口以允许访问者访问它的元素;如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)。

何时使用访问者模式

  1. 一个对象结构包含很多其他对象,它们有不同的接口,但是想对这些对象实施一些依赖其具体类型的操作。
  2. 需要对一个对象结构中的对象进行很多不相关的操作,但是不想让这些操作“污染”这些对象的类。可以将这些操作定义在访问者类中,在需要的时候通过访问者找到对象结构中的具体对象并实施操作。
  3. 定义的对象结构的类很少改变,但经常需要在这些结构上添加新的操作。

 

在ios中使用访问者模式

在Cocoa Touch框架中使用Core Graphics绘制一些简单的形状的视图,如圆形、矩形、线条等,根据需要在这些形状上可能还需要填充颜色,描边,添加阴影、渐变效果。我们可以将形状的数据结构和绘制形状的操作分离。绘制形状的数据结构很少会改变,但是以后可能会添加更多的操作以绘制出不同的形状。结构图如下:

 

  图中对象结构中的Rectangle类定义一个矩形区域的数据结构,用它可以绘制矩形、圆形、椭圆等形状;Line类定义了起始点和终点的数据结构,可以绘制线条;Path类定义了矢量形状的数据结构,可以绘制多边形。这些基本上能绘制出所有的形状,所以对象结构会很少改变。但是将来可能会添加更多的形状,那么只需添加一个新的访问者。

 

 

访问者模式优缺点

优点

  访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由扩展。给对象结构中的元素增加新操作,不必修改整个对象结构,只需实现一个具体访问者角色就可以。

缺点

  1. 增加新的数据结构很困难,访问者和目标类耦合在一起,如果需要在对象结构中添加新的元素类,那么访问者的父类和子类都要修改。访问者模式适合对象结构类改变较少的情况。
  2. 访问者角色要执行与元素角色相关操作,就必须让元素角色将内部属性暴露出来,这就意味着其它对象也可访问,这破坏了元素角色的封装性。

posted on 2013-06-13 18:38  Markhy  阅读(388)  评论(0编辑  收藏

导航