1700472161
设计模式之禅 25.2 访问者模式的定义
1700472162
1700472163
访问者模式(Visitor Pattern)是一个相对简单的模式,其定义如下:Represent anoperation to be performed on the elements of an object structure.Visitor lets you define a new operation without changing the classes of the elements on which it operates.(封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。)
1700472164
1700472165
访问者模式的通用类图如图25-5所示。
1700472166
1700472167
1700472168
1700472169
1700472170
图25-5 访问者模式的通用类图
1700472171
1700472172
看了这个通用类图,大家可能要犯迷糊了,这里怎么有一个ObjectStruture类呢?你刚刚举的例子怎么就没有呢?真没有吗?我们不是定义了一个List了吗?它中间的元素是我们一个一个手动增加上去的,这就是一个ObjectStruture,我们来看这几个角色的职责。
1700472173
1700472174
❑Visitor——抽象访问者
1700472175
1700472176
抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法的参数定义哪些对象是可以被访问的。
1700472177
1700472178
❑ConcreteVisitor——具体访问者
1700472179
1700472180
它影响访问者访问到一个类后该怎么干,要做什么事情。
1700472181
1700472182
❑Element——抽象元素
1700472183
1700472184
接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义的。
1700472185
1700472186
❑ConcreteElement——具体元素
1700472187
1700472188
实现accept方法,通常是visitor.visit(this),基本上都形成了一种模式了。
1700472189
1700472190
❑ObjectStruture——结构对象
1700472191
1700472192
元素产生者,一般容纳在多个不同类、不同接口的容器,如List、Set、Map等,在项目中,一般很少抽象出这个角色。
1700472193
1700472194
大家可以这样理解访问者模式,我作为一个访客(Visitor)到朋友家(Visited Class)去拜访,朋友之间聊聊天,喝喝酒,再相互吹捧吹捧,炫耀炫耀,这都正常。聊天的时候,朋友告诉我,他今年加官进爵了,工资也涨了30%,准备再买套房子,那我就在心里盘算(Visitor-self-method)“你这么有钱,我去年要借10万你都不借”,我根据朋友的信息,执行了自己的一个方法。
1700472195
1700472196
我们来看看访问者模式的通用源码,先看抽象元素,如代码清单25-11所示。
1700472197
1700472198
代码清单25-11 抽象元素
1700472199
1700472200
public abstract class Element{
1700472201
1700472202
//定义业务逻辑
1700472203
1700472204
public abstract void doSomething();
1700472205
1700472206
//允许谁来访问
1700472207
1700472208
public abstract void accept(IVisitor visitor);
1700472209
[
上一页 ]
[ :1.70047216e+09 ]
[
下一页 ]