简介

在开发过程中,通常存在将多种不同类型的元素对象放进同一个 object structure (集合)中的情况,并且这些元素对象会接受一类被称为访问者的对象的访问,而且不同的访问者对象对元素对象的访问方式也不同。

接下来用一个生活中的例子进行说明,在超市购物时,顾客会把不同类型的物品(比如苹果、图书)放进同一个购物车,这些物品会接受顾客和收银员的访问,顾客对物品的访问方式是:检查这些物品是否在保质期、是否完好等;收银员对物品的访问方式是:获取物品的价格。

如果把不同访问者对同一元素对象的访问方式封装进元素对象,就会污染元素对象,并且新增访问者时,需要修改所有元素对象。因此在访问者模式中,将访问者对象对所有元素对象的访问方式封装进访问者对象,元素对象需要实现 accept 方法,该方法接受访问者对象作为参数,并调用访问者对象对该元素对象的访问方式


角色


UML 类图

visitor.jpg