参考文献地址: http://gurudk.iteye.com/blog/322753 测试
分派过程就是肯定一个方法调用的过程,双分派就是根据运行时多个对象的类型肯定方法调用的过程。 this
想象这样一个客户服务的场景,通常客户支持有一级支持和二级支持。一级支持通常解决比较简单的问题,若是问题解决不了,就会由二级支持来解决。 spa
定义通常问题: 3d
class Problem { public: Problem(){} virtual ~Problem(){} };
定义特殊问题: 调试
class SpecialProblem:public Problem { public: SpecialProblem(){} ~SpecialProblem(){} };
定义一级支持: code
class Supporter { public: Supporter(){} virtual ~Supporter(){} virtual void solve(Problem &p) { std::cout<<"一级支持解决通常问题"<<std::endl; } virtual void solve(SpecialProblem &sp) { std::cout<<"一级支持解决特殊问题"<<std::endl; } };
定义资深支持: 对象
class SeniorSupporter:public Supporter { public: SeniorSupporter(){} ~SeniorSupporter(){} void solve(Problem &p) { std::cout<<"资深支持解决通常问题"<<std::endl; } void solve(SpecialProblem &sp) { std::cout<<"资深支持解决特殊问题"<<std::endl; } };
下面是测试类: blog
int main() { Problem *p=new Problem(); Problem *sp=new SpecialProblem(); Supporter *s=new SeniorSupporter(); s->solve(*p); s->solve(*sp); system("Pause"); return 1; }
如下是预料中的错误运行结果: 接口
s->solve(*p); s->solve(*sp);
class Problem { public: Problem(){} virtual ~Problem(){} virtual void solve(Supporter *s) { s->solve(*this); } //*virtual void solve(SeniorSupporter *sp) //{ // sp->solve(*this); //} };
class SpecialProblem:public Problem { public: SpecialProblem(){} ~SpecialProblem(){} void solve(Supporter *s) { s->solve(*this); } //void solve(SeniorSupporter *s) //{ // s->solve(*this); //} };
int main() { Problem *p=new Problem(); Problem *sp=new SpecialProblem(); Supporter *s=new SeniorSupporter(); p->solve(s); sp->solve(s); system("Pause"); return 1; }
如下是运行结果: ci
如今,经过调用:
p->solve(s); sp->solve(s);
来实现两次动态分派,第一次是problem中solve方法的多态,第二次是supporter中solve方法的多态。
Visitor模式也使用了相似的方式:
Visitor模式中的Accept也是一个double dispatch操做,它的含义决定于两个类型:Visitor的类型和Element的类型。这是Visitor模式的关键所在:获得执行的操做不只决定于Visitor的类型还决定于它访问的Element的类型。而采起的解决方案如上图,没有将操做静态的绑定在Element接口中,而是将其安放在一个Visitor中,并使用Accept在运行时进行绑定。
您的认真阅读我将不胜荣幸,您的指正修改我将万分感激。
版权全部,翻版不究,请注明出处便可。