代理模式:
为某个类提供了一个代理来控制访问它。
Provide a surrogate or placeholder for another object to control access to it.
UML图:
主要包括:
根据UML图编写的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
class Subject
{
public:
virtual void request()=0;
};
class RealSubject:public Subject
{
public:
void request()
{
std::cout<<"RealSubject::request()"<<std::endl;
}
};
class Proxy:public Subject
{
public:
void request()
{
//使用延迟初始化的技术
if(realSubject==NULL)
realSubject=new RealSubject();
realSubject->request();
}
private:
RealSubject * realSubject;
};
int main()
{
std::cout<<"代理模式测试:"<<std::endl;
Proxy * proxy=new Proxy();
proxy->request();
delete proxy;
return 0;
}
输出:
然后是一个真实的例子,使用代理模式实现加减乘除运算:
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
/**一个真实的代理模式的例子
* Proxy为MathProxy,客户端可见的是这个代理类的对象
* Subject为IMath,这个是代码类和真实的主题必须遵循的接口
* RealSubject为Math,真正完成工作的类是这个类
*/
class IMath
{
public:
virtual double add(double lhs,double rhs)=0;
virtual double sub(double lhs,double rhs)=0;
virtual double div(double lhs,double rhs)=0;
virtual double mul(double lhs,double rhs)=0;
};
class Math:public IMath
{
public:
double add(double lhs,double rhs)
{
return lhs+rhs;
}
double sub(double lhs,double rhs)
{
return lhs-rhs;
}
double div(double lhs,double rhs)
{
return lhs/rhs;
}
double mul(double lhs,double rhs)
{
return lhs*rhs;
}
};
class MathProxy:public IMath
{
public:
MathProxy()
{
math=new Math();
}
~MathProxy()
{
if(math!=NULL)
{
delete math;
math=NULL;
}
}
double add(double lhs,double rhs)
{
return math->add(lhs,rhs);
}
double sub(double lhs,double rhs)
{
return math->sub(lhs,rhs);
}
double div(double lhs,double rhs)
{
return math->div(lhs,rhs);
}
double mul(double lhs,double rhs)
{
return math->mul(lhs,rhs);
}
private:
Math * math;
};
int main()
{
std::cout<<"真实的代理模式的例子"<<std::endl;
MathProxy* proxy=new MathProxy();
std::cout<<"lhs:1 rhs:2"<<std::endl;
std::cout<<"proxy->add:"<<proxy->add(1,2)<<std::endl;
std::cout<<"proxy->sub:"<<proxy->sub(1,2)<<std::endl;
std::cout<<"proxy->div:"<<proxy->div(1,2)<<std::endl;
std::cout<<"proxy->mul:"<<proxy->mul(1,2)<<std::endl;
return 0;
}
输出:
原文地址:http://blog.csdn.net/u012501459/article/details/46342281