#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能夠大幅度的下降拷貝龐大實體時的開銷。設計模式
代理模式可以 協調調用者和被調用者 ,在必定程度上下降了系統的耦合度。代理模式的缺點 因爲在客戶端和真實主題之間增長了代理對象,所以有些類型的代理模式可能會形成請求的處理速度變慢。 實現代理模式須要額外的工做,有些代理模式的實現很是複雜。