23种设计模式之python实现--visitor模式

来源:互联网 发布:买手机哪几个淘宝网好 编辑:程序博客网 时间:2024/06/03 14:36

这个模式涉及到双分派,一直没有好好理解,加上前几天参加面试把最后一个设计模式搁了下来,这次重新看设计模式好好理解了一下,在C++中关于双分派可以参考http://my.oschina.net/coolwater/blog/27676,不过他举的例子有点复杂,简单一点就是:

#include<iostream>using namespace std;class A{};class B:public A{};class C{public:    void single(A &a){        cout<<"A_C"<<endl;    };    void single(B &b){        cout<<"B_C"<<endl;    };};int main(){    C test=C();    A *a=new A();    A *b=new B();    test.single(*a);    test.single(*b);}
由于C++在静态编译时支持多分派,但分派取决于申明类型,所以输出的都是A_C,对于解决就像是文中提到的使用多态以及参数的往来传递实现动态的双重分派了,对于python没有指针的概念,所以上面的代码一定能输出A_C和B_C,不过为了模拟visitor参数的往来传递,我通过python实现文章中的解决办法

#理解#关键是双分派的理解#例子#http://my.oschina.net/coolwater/blog/27676#Elementclass Problem:    def getProblem(self,s):#accept        print "一般问题",        s.solve(self)class SpecialProblem(Problem):    def getProblem(self,s):        print "特殊问题",        s.solve(self)#visitorclass Supporter:    def solve(self,p):        print "由一级支持解决"class SeniorSupporter(Supporter):    def solve(self,p):        print "由资深支持解决"#clientif __name__=="__main__":    s=Supporter()    ss=SeniorSupporter()    p=Problem()    sp=SpecialProblem()    p.getProblem(s)    p.getProblem(ss)    sp.getProblem(s)    sp.getProblem(ss)

运行结果如图:


到这里,23种设计模式就全部用python实现了,明天写一下总结,这个话题就结束了。



0 0