系部网站建设需求分析,兰州拼团网站建设,汽车网站建设公司,企业网站管理系统哪个好文章目录 一、什么代理模式二、代理模式的实现原理三、代理模式应用场景四、代理模式的代码实现 一、什么代理模式 代理模式是一种结构型设计模式#xff0c;它允许通过创建一个代理对象来控制对另一个对象的访问。代理对象充当了客户端和目标对象之间的中介#xff0c;可以在… 文章目录 一、什么代理模式二、代理模式的实现原理三、代理模式应用场景四、代理模式的代码实现 一、什么代理模式 代理模式是一种结构型设计模式它允许通过创建一个代理对象来控制对另一个对象的访问。代理对象充当了客户端和目标对象之间的中介可以在不改变目标对象的情况下增加额外的功能或控制访问。 二、代理模式的实现原理
定义一个接口首先需要定义一个接口该接口是代理对象和目标对象共同实现的接口。这个接口定义了客户端可以使用的方法。创建目标对象实现接口的目标对象是真正执行业务逻辑的对象。创建代理对象代理对象也实现了接口并持有一个对目标对象的引用。代理对象在执行方法时会调用目标对象的相应方法并可以在调用前后执行一些额外的操作。客户端使用代理对象客户端通过代理对象来访问目标对象而不是直接访问目标对象。客户端可以像访问目标对象一样使用代理对象而无需关心代理对象和目标对象之间的具体实现细节。 代理模式的实现可以有多种形式包括静态代理和动态代理。静态代理是在编译时就已经确定代理对象和目标对象的关系而动态代理是在运行时动态生成代理对象。 三、代理模式应用场景 远程代理当对象位于不同的地址空间时可以使用代理模式来在客户端和远程对象之间建立通信使得客户端可以透明地访问远程对象。 虚拟代理当创建一个对象需要很大的开销时可以使用代理模式来延迟对象的实例化只有在真正需要时才创建对象。这样可以提高系统的性能和资源利用率。 安全代理代理模式可以控制对真实对象的访问权限只有满足特定条件的客户端才能访问真实对象从而保护真实对象的安全性。 日志记录代理代理模式可以在调用真实对象的方法前后进行一些额外的操作比如记录日志、统计方法调用次数等。 缓存代理代理模式可以为一些昂贵的操作提供缓存当相同的请求到达时可以直接返回缓存中的结果避免重复计算。 延迟加载代理代理模式可以延迟加载真实对象只有在真正需要时才加载从而提高系统的响应速度。 举个例子假设有一个图片加载器类ImageLoader它负责从网络上下载图片并显示。为了提高性能我们可以使用代理模式来实现一个图片加载器的代理类ImageLoaderProxy。当客户端调用ImageLoaderProxy的loadImage方法时代理类会先检查本地缓存中是否存在该图片如果存在则直接返回缓存的图片如果不存在则调用实际的ImageLoader对象来下载并显示图片并将下载的图片缓存起来。这样代理类在不改变原有ImageLoader类的情况下增加了缓存功能。 四、代理模式的代码实现
//------------------------------------------------------------------
//| Proxy.mqh |
//------------------------------------------------------------------
//------------------------------------------------------------------
//| interface — for patterns |
//------------------------------------------------------------------
interface ClientInterface //pattern client
{string Output(void); //returns headervoid Run(void); //execute the pattern client
};
//------------------------------------------------------------------
//| interface — for patterns |
//------------------------------------------------------------------
void Run(ClientInterface* client) //launches a pattern
{printf(---\n%s,client.Output()); //print pattern headerclient.Run(); //execute client collaborationsdelete client; //exit
}
//------------------------------------------------------------------
//| structure |
//------------------------------------------------------------------
// |Client|--------------------------| Subject |
// |---------|
// |Request()|
// |... |
// ^
// |
// ------------------------------------------------...
// | real_subject |
// |RealSubject|-----------------| Proxy |
// |-----------| |----------------------|
// |Request() | |Request() |
// |... | | ... |
// | realSubject.Request()|
// | ... |
// |... |
//------------------------------------------------------------------
// 定义真实主体和代理的公共接口
// 以便在任何需要真实主体的地方都可以使用代理
class Subject
{public:virtual void Request(void)0;
};
// 定义代理所代表的真实对象。
class RealSubject:public Subject
{public:void Request(void);
};
//
void RealSubject::Request(void)
{Print(real subject);
}
//维护一个引用该引用允许代理访问真实主体
class Proxy:public Subject
{protected:RealSubject* real_subject;public:~Proxy(void);void Request(void);
};
//
Proxy::~Proxy(void)
{delete real_subject;
}
//
void Proxy::Request(void)
{if(!CheckPointer(real_subject)){real_subjectnew RealSubject;}real_subject.Request();
}
//
class Client:public ClientInterface
{public:string Output(void);void Run(void);
};
string Client::Output(void)
{return __FUNCTION__;
}
//
void Client::Run(void)
{Subject* subjectnew Proxy;subject.Request();delete subject;
}
//------------------------------------------------------------------
//| script program start function |
//------------------------------------------------------------------
void OnStart()
{//---structuralRun(new Proxy::Client);
}
//------------------------------------------------------------------
//| output |
//------------------------------------------------------------------
// Proxy::Client::Output
// real subject