Proxy模式

                   
Proxy模式是 構造型的設計模式之一.
所謂代理,是指具備與代理元(被代理的對象)具備相同的接口的類,客戶端必須經過代理與被代理的目標類交互,而代理通常在交互的過程當中(交互先後),進行某些特別的處理。
 
根據這些「特別處理」的不一樣, 有如下幾種常見的代理模式
- Remote proxy遠程代理。該代理可讓客戶端透明地引用一個存在於不一樣地址空間(遠程或本地)的對象。
-   Virtual proxy:虛擬代理。該代理容許一個對象只有在真正被用到時才被建立。
-   Copy-on-write proxy:對象拷貝延遲代理。該代理能夠延遲一個對象的拷貝(clone)操做到客戶調用裏,它是virtual proxy模式的一種特殊狀況。通常來講,對象的深度克隆是一個高開銷的動做,該代理可讓這個動做延遲,只有對象被用到的時候才被克隆。
- Protection (access) proxy訪問保護代理。該代理能夠在訪問一個對象時附加一些檢查操做,好比權限驗證等。
- Cache proxy緩存代理。主要爲那些建立時高開銷的對象提供緩存,以供多客戶端共享。
-   Firewall proxy:防火牆代理。保護目標對象不受某些不良客戶端的侵害。
-   Synchronization proxy:爲非同步的目標對象提供併發控制。
- Smart reference proxy當一個對象被引用時提供某些額外的操做。好比對象被引用時,記錄對象被引用的次數等。
==========================================================================================================
上面對proxy模式的闡述來自網絡
下面是我對 Protection (access) proxy的一個實現。
 
#ifndef FILEOPERATOR_H
#define FILEOPERATOR_H
 
 
#include <iostream>
using namespace std;
 
 
class FileOperator
{
public:
 enum permission {READ ,ALL};
 FileOperator();
 FileOperator(permission _p);
 virtual ~FileOperator() = 0;
 virtual string getFileName()const = 0;
 virtual int getLength() const = 0;
 virtual string modify(string context) = 0;
protected:
 permission getPermission() const {return p;}
private:
 permission p;
};
 
 
#endif // FILEOPERATOR_H
#include "fileoperator.h"
FileOperator::FileOperator(permission _p):p(_p)
{
}
FileOperator::FileOperator()
{
    p = FileOperator::READ;
}
FileOperator::~FileOperator()
{
}
#ifndef PROXYFILEOPERATOR_H
#define PROXYFILEOPERATOR_H
#include "fileoperator.h"
#include "realfileoperator.h"
class ProxyFileOperator: public FileOperator
{
public:
    ProxyFileOperator(string _name);
    ProxyFileOperator(string _name,permission _p);
    ~ProxyFileOperator(){delete real;}
    string getFileName() const{return real->getFileName();}
    int getLength()const {return real->getLength();}
    string modify(string context) {return real->modify(context);}
private:
    RealFileOperator *real;
};
#endif // PROXYFILEOPERATOR_H
#include "proxyfileoperator.h"
ProxyFileOperator::ProxyFileOperator(string _name, permission _p):FileOperator(_p)
{
    real = new RealFileOperator(_name,getPermission());
}
ProxyFileOperator::ProxyFileOperator(string _name):FileOperator()
{
    real = new RealFileOperator(_name);
}
#ifndef REALFILEOPERATOR_H
#define REALFILEOPERATOR_H
#include "fileoperator.h"
class RealFileOperator : public FileOperator
{
public:
    RealFileOperator(string _name);
    RealFileOperator(string _name,permission _P);
    ~RealFileOperator(){}
    string getFileName()const {return fileName;}
    int getLength()const {return fileName.length();}
    string modify(string context);
private:
    string fileName;
};
#endif // REALFILEOPERATOR_H
#include "realfileoperator.h"
RealFileOperator::RealFileOperator(string _name, permission _P):FileOperator(_P),fileName(_name)
{
}
RealFileOperator::RealFileOperator(string _name):FileOperator(),fileName(_name)
{
}
string RealFileOperator::modify(string context)
{
    if(getPermission() == FileOperator::ALL) {
        fileName += context;
        return "ok";
    }
    else {
        return "no";
    }
}
#include <iostream>
using namespace std;
#include "proxyfileoperator.h"
int main()
{
    FileOperator *p = new ProxyFileOperator("I am zhou xiang!");
    cout << p->getFileName()<<'\n';
    if (p->modify("Love ChenChen!\n") == "ok") {
        cout << p->getFileName();
    }
    else {
        cout<<"ERROR Permission denied!";
    }
    delete p;
    return 0;
}
默認只有讀的權限,輸出爲
修給以後, FileOperator *p = new ProxyFileOperator("I am zhou xiang!",FileOperator::ALL);
輸出結果,
====================================================================================================
        
      
        
      
        
      
         
         
         
         
      
        

Proxy模式在訪問對象時引入了必定程度的間接性。根據代理的類型,附加的間接性有多種用途: 1) Remote Proxy能夠隱藏一個對象存在於不一樣地址空間的事實。也使得客戶端能夠訪問在遠程機器上的對象,遠程機器可能具備更好的計算性能與處理速度,能夠快速響應並處理客戶端請求。 2) Virtual Proxy 能夠進行最優化,例如根據要求建立對象。即經過使用一個小對象來表明一個大對象,能夠減小系統資源的消耗。 3) Protection Proxies和Smart Reference都容許在訪問一個對象時有一些附加的內務處理(Housekeeping task) 。ios

Proxy模式還能夠對用戶隱藏另外一種稱之爲寫時複製(copy-on-write)的優化方式,該優化與根據須要建立對象有關。拷貝一個龐大而複雜的對象是一種開銷很大的操做,若是這個拷貝根本沒有被修改,那麼這些開銷就沒有必要。用代理延遲這一拷貝過程,咱們能夠保證只有當這個對象被修改的時候纔對它進行拷貝。在實現copy-on-write時必須對實體進行引用計數。拷貝代理僅會增長引用計數。只有當用戶請求一個修改該實體的操做時,代理纔會真正的拷貝它。在這種狀況下,代理還必須減 少實體的引用計數。當引用的數目爲零時,這個實體將被刪除。copy-on-write能夠大幅度的下降拷貝龐大實體時的開銷。設計模式

代理模式可以 協調調用者和被調用者 ,在必定程度上下降了系統的耦合度。
代理模式的缺點 因爲在客戶端和真實主題之間增長了代理對象,所以有些類型的代理模式可能會形成請求的處理速度變慢。 實現代理模式須要額外的工做,有些代理模式的實現很是複雜。
相關文章
相關標籤/搜索