由遇到的問題引出代理模式
至少在以下集中情況下可以用代理模式解決問題:
UML 圖:
角色:
舉例:
假若你有一個工廠開始是生產手機的,但是它現在不想自己生產了,它把自己的東西交給了一家代工廠富士康去生產,那么便有了下面的代碼去構建。
統一的抽象接口 IFactory
class IFactory { public: IFactory(){} virtual void makeProduct() = 0; };
你的手機工廠
class PhoneFactory : IFactory { public: PhoneFactory(){} void makeProduct() { cout<<"生產手機"<<endl; } };
專門做代工的代理工廠富士康
class FoxconnProxy : IFactory { public: FoxconnProxy(IFactory* factory) { m_real = factory; } void makeProduct() { m_real->makeProduct(); } private: IFactory* m_real; };
客戶端:
IFactory* factory = new PhoneFactory(); FoxconnProxy* proxy = new FoxconnProxy(factory); proxy->makeProduct();
看了uml圖和上面的代碼你會可能會發現,先訪問代理類再訪問真正要訪問的對象。似乎這樣有點多此一舉的味道,其實不然。代理類可以在真正的類執行之前,進行預處理。 比富士康生產的手機之前可能會堅持元器件是否合格,不合格就不生產等。在比如你有一個系統實現了登陸功能,在用戶登錄時, 真正的登錄類和代理登錄類都實現了Login接口, 不同的是Proxy類的方法中增加了用戶是否合法的判斷, 只有合法時才去調用真正登錄類的login方法. 用戶訪問的其實是Proxy的login方法.這都是代理模式的優點。而且采用代理模式的話,并且你可以隨時更改代理。還有一點你會發現,真正對象與代理他們實現同一個接口。
這個模式和裝飾者模式有點類似之處,都是包裝,但是請注意他們應用場景不一樣:一個是動態的給類添加職責,一個是控制對這個對象的訪問。最重要的一點不同是他們的結構不同,你對比下兩個模式的uml圖便知。
新聞熱點
疑難解答
圖片精選