設計模式筆記15:代理模式

Proxy


動機

  • 在面向對象系統中,有些對象由於某種原因(比如對象創建的開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問等), 直接訪問會給使用者、或者系統結構帶來很多麻煩。
  • 如何在不失去透明操作對象的同事來管理/控制這些對象特有的複雜性?增加一層間接層是軟件開發中常見的解決方式。

模式定義

爲其他對象提供一種代理以控制(隔離,使用接口)對這對象的訪問。 ——《設計模式》GoF
(就比如明星跟經紀人的關係,你要安排商演,必須經過經紀人的同意。)


要點總結

  • “增加一層間接層”是軟件系統中對許多複雜問題的一種常見解決方法。直接使用某些對象會帶來很大問題,做爲間接層的Proxy對象是解決這一問題的常用手段。
  • Proxy並不一定要求保持接口完整的一致性,只要能夠實現間接控制,有時候損及一些透明性是可以接受的。
  • Decorator、Facade、Proxy、Adapter都可以說是給對象添加一層包裝,但目的不一樣(Proxy在一些分佈式的webServer中最常用,客戶端想訪問server時可以用工具在生成一個Proxy與server進行通訊)

Demo

client.cpp:

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();
        
        //....
    }
};

proxy.cpp:

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();
        
        //....
    }
};

結構

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章