派(Dispatch)

单派与多派

(Single Dispatch and Multi Dispatch)

    "检查一个数据项的类型,并据此去调用某个适当的过程称为基于类型的分派"。

    上面是来自《计算机程序的解释与构造》的一段话,今日有幸读到。对于Dispatch这个词,我第一次接触,是来自Com/DCom年代的自动化接口(IDispatcher),然后一直就很朦胧,知道那么会事,但是没有一个清晰的认识。

    OOP中的多态就属于典型的单分派,对一个多态方法的调用是通过对象的实际类型确定的。

对于如下代码调用:

            IObj a = new ObjA();

            IObj b = new ObjB();

            IObj c = new ObjC();

            a.Func();

            b.Func();

            c.Func();

虽然同样是对Func的调用,但是其分别"检查了a,b,c的实际类型,并据此去调用某个对应的方法",为什么是叫,因为参与确定方法的因素只有一个,就是类型。

 

确定具体方法的只需要查询这个一维表格,而双派的典型应用就是设计模式中的访问者模式。

下面是一个典型的访问模式的结构图:

 

 

 

    访问者模式要确定调用哪个方法,需要有两个维度来确定,一个维度是结构,包含ObjA,ObjB,ObjC,一个维度是行为,包括VisA,VisB,VisC。

    如下调用:

IObj obj = new ObjB();
IVis func = new VisB();
obj.Accept(func);

如上表格,确定最后调用哪个方法,有两个维度决定调用VisB::Do(ObjB),同理,如下调用:

IObj obj = new ObjC();
IVis func = new VisA();
obj.Accept(func);

 


			

    我能想到的应用也只有双派,是否有更多的派,我就不了解了。

posted @ 2015-10-22 17:32  赛提斯特  阅读(596)  评论(0编辑  收藏  举报