访问者模式定义是数据稳定,操作变化时,在不改变数据结构情况下,新增操作。
网上搜索一下,全都是正确的,有蜜蜂采花的:说有几种花,2种蜜蜂去采。有医院拿药的:有几种药,到2个部门去操作。全部都用到了访问者模式,代码当然没问题。但是我看了也是蒙蔽,TM到底什么情况下使用这个模式?
去看了下大话设计模式的例子:男女2种人,在不同状态下不同的操作。成功时:男女分别是什么心情,失败时又是什么心情,状态会变化。
刚开始代码是
男人(zt){
if(zt1){...}
else if(zt2){...}
}
女人(zt){
if(zt==zt1){...}
else if(zt==zt2){...}
}
在状态会增加,男女不变的情况下,显然直接使用了访问者模式。可能我比较愚钝,怎么就直接使用了模式,跳跃还是比较大,也是很蒙蔽啊。
如果是我自己写,既然状态会多
状态1(person){
if (男人){}
else if(女人){}
}
状态2(person){
if (男人){}
else if(女人){}
}
...... 这样不是状态可扩展,if 方法判断复杂,直接改为多态。
接口 zt{
visitor(男人){...}
visitor(女人){...}
}
zt1{
visitor(男人){...}
visitor(女人){...}
}
zt2{
visitor(男人){...}
visitor(女人){...}
}
由于状态是基于接口(现在不都是接口编程吗,有啥好说的),但是离访问者模式代码很远啊
people{
acapt(zt);
}
男人(zt){
acapt(zt){ zt.visitor(男人)}
}
女人(zt){
acapt(zt){ zt.visitor(女人)}
}
为什么要这样写?将访问入口写在people类中?为什么不直接调用
People p = new Man();
Statle s = new AStatle();
s.visit(p);//报错 子类可以取代父类,父类当然不能取代子类
代码调用者 和 参数 有自己的静态类型和实际类型,参数的实际类型不影响分派。
People p = new Man();
Statle s = new AStatle();
p.accept(s);
这样写确实完美了,经过了几次演变,发现个问题,一是把数据和行为分开,哪个是固定即数据,那个是变化即行为?
其实根据具体场景,如果是 人去游览比如海洋馆和植物园,到底哪个可变,那个不可变?还是看需求
如果都是可变,也就用不了这个模式了。
网友评论