1. 程式人生 > >23種設計模式之python實現--visitor模式

23種設計模式之python實現--visitor模式

這個模式涉及到雙分派,一直沒有好好理解,加上前幾天參加面試把最後一個設計模式擱了下來,這次重新看設計模式好好理解了一下,在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
#Element
class Problem:
    def getProblem(self,s):#accept
        print "一般問題",
        s.solve(self)
class SpecialProblem(Problem):
    def getProblem(self,s):
        print "特殊問題",
        s.solve(self)
#visitor
class Supporter:
    def solve(self,p):
        print "由一級支援解決"
class SeniorSupporter(Supporter):
    def solve(self,p):
        print "由資深支援解決"
#client
if __name__=="__main__":

    s=Supporter()
    ss=SeniorSupporter()
    p=Problem()
    sp=SpecialProblem()
    p.getProblem(s)
    p.getProblem(ss)
    sp.getProblem(s)
    sp.getProblem(ss)

執行結果如圖:


到這裡,23種設計模式就全部用python實現了,明天寫一下總結,這個話題就結束了。