大话设计模式里面的例子:
小王想追求小娟,但他不认识小娟。但他的朋友小林认识小娟,所以他通过让小林帮忙送礼物的方式追求小娟。
这里的小林就是我们的代理!
代理模式的目的是: 隐藏真实访问对象,同时可以处理别的事情
定义
代理模式:为其他对象提供一种代理以控制对这个对象的访问
也就是说,代理是一个中介, 它连接客户端和目标对象,同时可以附加对种用途
模式结构
例子:
class Girl {
public:
Girl(char* name = ""):mName(name){}
char* getName() {
return mName;
}
private:
char* mName;
};
class GiveGift {
public:
virtual void GiveDolls() = 0;
virtual void GiveFlowers() = 0;
virtual void GiveChocolate() = 0;
};
class Puisuit : public GiveGift {
public:
Puisuit(Girl mm):mGirl(mm){}
virtual void GiveDolls() {
cout<<"送"<<mGirl.getName()<<"玩具!"<<endl;
}
virtual void GiveFlowers() {
cout<<"送"<<mGirl.getName()<<"鲜花!"<<endl;
}
virtual void GiveChocolate() {
cout<<"送"<<mGirl.getName()<<"巧克力!"<<endl;
}
private:
Girl mGirl;
};
class Proxy : public GiveGift {
public:
Proxy(Girl mm) {
mPuisuit = new Puisuit(mm);
}
virtual void GiveDolls() {
mPuisuit->GiveDolls();
}
virtual void GiveFlowers() {
mPuisuit->GiveFlowers();
}
virtual void GiveChocolate() {
mPuisuit->GiveChocolate();
}
private:
Puisuit* mPuisuit;
};
#include <iostream>
#include "Proxy.h"
using namespace std;
int main() {
Girl mm("小娟");
Proxy pro(mm);
pro.GiveChocolate();
pro.GiveDolls();
pro.GiveFlowers();
return 0;
}
优点:
在不改变原有代码的情况下,把类的核心功能和装饰功能区分开了,并能动态扩展一个对象的新功能
缺点:
对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。