代理模式:通過創建一個代理對象來控制對某些特定對象的訪問。
在我們的編程的日子裏,經常會遇到這一類的問題,例如爲了保護一個數據對象的安全,在某些特定情況下要限制對該對象的某些訪問,或者控制某些對象在執行事情的同時可以順便處理其他的事件,亦或者是對於某些創建開銷很大的對象,不適於經常性的創建釋放,可以通過代理來存放該對象的實例。
代理模式實現的方法很是簡單,具體如下:
首先我們需要一個具體的需要實例化的對象:然後我們需要將這個對象的一些方法提取出來製成接口,讓代理類和實例化類都繼承於該接口類。
我所使用的是這樣一個例子:
一個明星,他的活動並不總是需要通過找到他自己,人們可以通過他的發言人作爲中間橋樑;
首先我需要這樣一個活動接口:讓發言人和明星都擁有同樣的行爲;這樣人們便可以通過訪問發言人來訪問該明星;
#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