访问者模式的概念:访问者模式即表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作
个人觉得,上述概念用到的基本术语才是这个模式难学的根本.
我所理解的访问者模式:就是找出操作的通用部分封装起来,然后在大量需要该操作的时候,都只要通过这一个接口,好处是什么?
我举个例子:
1.我有一个数字列表:[(1,2),(3,4),(5,6),...,(n,m)] 其中(1,2)等表示用于一组操作的数据(也可以理解成一个对象)
2.我要对每一对数字(如1和2,又如3和4),进行打印他们的和
假如只考虑[(1,2),(3,4),(5,6)]
如果直接不采用任何方法来优化,我会这样写
Python代码:
lst = [(1,2),(3,4),(5,6)]
for x, y in lst:
print x+y
C代码:
#include
struct node {
int x,y;
}nod;
int main(void){
struct node lst[3] = {{1,2},{3,4},{5,6}};
int i;
for(i=0;i<3;i++){
printf("%d\n",lst[i].x+lst[i].y);
}
return 1;
}
如果应用到访问者模式,我会这样写
Python代码:
def PrintValue(tup):
print sum(tup)
lst = [(1,2),(3,4),(5,6)]
for tup in lst:
PrintValue(tup)
C代码:
#include
struct node {
int x,y;
}nod;
void PrintValue(struct node nd){
printf("%d\n",nd.x+nd.y);
}
int main(void){
struct node lst[3] = {{1,2},{3,4},{5,6}};
int i;
for(i=0;i<3;i++){
PrintValue(lst[i]); //统一操作
}
return 1;
}
看完之后你就发现,对了,就是封装,然后简化成一个通用的操作来使用
于是我们来解析上述的概念:
1.表示一个作用于某对象结构中的各元素的操作:代码中lst就相当于对象,各元素就不用我解释了吧?如lst[0]的就是其中一个,即(1,2).
2.它使我们可以在不改变各元素的类的前提下:这才是重点,不改变元素的类,即元素的结构,如你把(1,2)变成(3,4)这叫没改变,但是你改成(3,4,5)那就改变了,为什么?多了个数字啊.
3.定义作用于这些元素的新操作:这里有一个关键字”这些”,错了是词^^,这些元素的新操作,这个操作要能作用于这些元素,那么有一点肯定符合,那就是通用,于是用这一个操作接口,就能对n多个这种”类”的元素进行处理了.
说到底,就是你的数据能被你找到通用性,然后将通用的部分封装成”访问者模式”中的”被访问者”,然后每个数据就只要访问它就能享受它的操作了,同时新增的数据也一定要符合这个通用性.
说到这个模式难理解,我也花了几个小时,最终找到一个实例才理解的.最后发现蛮操蛋的,就是封装起来吧,网上的代码都写得那么玄乎,不过这篇博文仅代表个人理解和看法,可受任何怼.