一,访问者模式的角色:抽象访问者:声明一个或者多个访问操作,形成所有的具体元素都要实现的接口具体访问者:实现抽象访问者所声明的接口
作者:中国IT实验室 来源:中国IT实验室 2007年8月26日
关键字:
二,动态分派
1,定义:发生在运行期,动态分派,动态的置换掉某个方法。
还是上边类似的例子:
class Cat{
public void eat(){
System.out.println("cat eat");
}
}
public class BlackCat extends Cat{
public void eat(){
System.out.println("black cat eat");
}
public static void main(String[] args){
Cat cat = new BlackCat();
cat.eat();
}
}这个时候的结果是:
black cat eat
这样的结果是因为在执行期发生了向下转型,就是动态分派了。
三,单分派:
1,定义:根据一个宗量的类型进行方法的选择
四,多分派:
1,定义:根据多于一个宗量的类型对方法的选择
2,说明:多分派其实是一系列的单分派组成的,区别的地方就是这些但分派不能分割。
3,C++ ,Java都是动态单分派,静态多分派语言
多分派的语言有:CLOS Cecil
访问差异类型的集合类--visitor模式入门
访问差异类型的集合类--visitor模式入门
本文对应代码下载这里
一,问题提出
访问同一类型的集合类是我们最常见的事情了,我们工作中这样的代码太常见了。
1 Iterator ie = list.iterator();
2 while (ie.hasNext()) {
3 Person p = (Person)ie.next();
4 p.doWork();
5 }
这种访问的特点是集合类中的对象是同一类对象Person,他们拥有功能的方法run,我们调用的恰好是这个共同的方法。
在大部份的情况下,这个是可以的,但在一些复杂的情况,如被访问者的继承结构复杂,被访问者的并不是同一类对象,
也就是说不是继承自同一个根类。方法名也并不相同。例如Java GUI中的事件就是一个例子。
例如这样的问题,有如下类和方法:
类:PA ,方法:runPA();
类:PB ,方法:runPB();
类:PC ,方法:runPC();
类:PD ,方法:runPD();
类:PE ,方法:runPE();
有一个集合类List
List list = new ArrayList();
list.add(new PA());
list.add(new PB());
list.add(new PC());
list.add(new PD());
list.add(new PE());
....