#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能够大幅度的下降拷贝庞大实体时的开销。设计模式
代理模式可以 协调调用者和被调用者 ,在必定程度上下降了系统的耦合度。代理模式的缺点 因为在客户端和真实主题之间增长了代理对象,所以有些类型的代理模式可能会形成请求的处理速度变慢。 实现代理模式须要额外的工做,有些代理模式的实现很是复杂。