15 設計模式_代理模式(Proxy)

Proxy代理模式

動機(Motivation)
  • 在面向對象系統中,有些對象由於某種原因(比如對象創建的開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問等), 直接訪問會給使用者、或者系統結構帶來很多麻煩。
    • 間接訪問,接口隔離。
  • 如何在不失去透明操作對象的同時來管理/控制這些對象特有的複雜性?增加一層間接層是軟件開發中常見的解決方式。
模式定義
  • 爲其他對象提供一種代理以控制(隔離,使用接口)對這對象的訪問。
舉個例子
  • 使用代理模式前
class ISubject{
public:
    virtual void process();
};


class RealSubject: public ISubject{
public:
    virtual void process(){
        //....
    }
};

class ClientApp{
    
    ISubject* subject;
    
public:
    
    ClientApp(){
    	對實際對象的直接訪問。
    	這裏是不合適的,可能由於性能原因,安全控制,系統分步等,壓根無法獲取到實例
        subject=new RealSubject();
    }
    
    void DoTask(){
        //...
        subject->process();
        
        //....
    }
};
  • 使用代理模式後
class ISubject{
public:
    virtual void process();
};


//Proxy的設計
class SubjectProxy: public ISubject{
    
    
public:
    virtual void process(){
        對RealSubject的一種間接訪問
        可以做一些相應的操作
        //....
    }
};

class ClientApp{
    
    ISubject* subject;
    
public:
    
    ClientApp(){
        subject=new SubjectProxy();
    }
    
    void DoTask(){
        //...
        subject->process();
        
        //....
    }
};
結構(Structure)

在這裏插入圖片描述

要點總結
  • 增加一層間接層”是軟件系統中對許多複雜問題的一種常見解決方案。在面向對象系統中,直接使用某些對象會帶來很多問題,作爲間接層的Proxy對象便是解決這一問題的常用手段
  • 具體Proxy設計模式的實現方法、實現粒度都相差很大,有些可能對單個對象做細粒度的控制,如copy-on-write技術,有些可能對組建模塊提供抽象代理層,在架構層次對對象做proxy
  • Proxy並不一定要求保持接口完整的一致性,只要能夠實現間接控制,有時候損及一些透明性是可以接受的。
發佈了37 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章