代理模式:通过创建一个代理对象来控制对某些特定对象的访问。
在我们的编程的日子里,经常会遇到这一类的问题,例如为了保护一个数据对象的安全,在某些特定情况下要限制对该对象的某些访问,或者控制某些对象在执行事情的同时可以顺便处理其他的事件,亦或者是对于某些创建开销很大的对象,不适于经常性的创建释放,可以通过代理来存放该对象的实例。
代理模式实现的方法很是简单,具体如下:
首先我们需要一个具体的需要实例化的对象:然后我们需要将这个对象的一些方法提取出来制成接口,让代理类和实例化类都继承于该接口类。
我所使用的是这样一个例子:
一个明星,他的活动并不总是需要通过找到他自己,人们可以通过他的发言人作为中间桥梁;
首先我需要这样一个活动接口:让发言人和明星都拥有同样的行为;这样人们便可以通过访问发言人来访问该明星;
#pragma once
class people
{
public:
people();
~people();
virtual void readme()=0;
virtual void selfassessment() = 0;
};
#include "people.h"
people::people(){}
people::~people(){}
然后接下来是明星的实例化类:
#pragma once
#include<iostream>
#include<string>
#include"people.h"
using namespace std;
class Star:
public people
{
public:
Star(string name);
~Star();
string name;
void readme();
void selfassessment();
};
#include "Star.h"
Star::Star(string name)
{
this->name = name;
}
Star::~Star(){}
void Star::selfassessment() {
cout << "我是个sb" << endl;
}
void Star::readme() {
cout << "我叫" << name << endl;
}
这里面包含了明星的行为;然后我们需要创建一个代理类来作为明星的代理发言人
pragma once
#include "people.h"
#include "Star.h"
class Spokesman :
public people
{
public:
Spokesman(Star* star);
virtual ~Spokesman();
Star* star;
void readme();
void selfassessment();
void SetStar(Star* star);
};
#include "Spokesman.h"
Spokesman::Spokesman(Star* star)
{
SetStar(star);
}
Spokesman::~Spokesman(){}
void Spokesman::readme() {
star->readme();
}
void Spokesman::selfassessment() {
star->selfassessment();
}
void Spokesman::SetStar(Star* star) {
this->star = star;
}
这部分代码的结构和装饰者模式有些相似,但是含义是并不相同的
我们可以通过对该代理类的访问来访问到原始的明星对象,同样只要稍作修改就可以禁止对该明星的某些访问,当出现需要对某一对象进行不同权限的访问的时候就可以通过不同的代理来实现。
或者是当某一对象需要被多个其它的对象访问并改变的时候,可以通过这种模式来实现该一个对象在多个不同的地方的统一访问
我的代码样例地址如下:
http://pan.baidu.com/s/1miLA7Qo