大話設(shè)計模式里面的例子:
小王想追求小娟箱靴,但他不認(rèn)識小娟腺逛。但他的朋友小林認(rèn)識小娟,所以他通過讓小林幫忙送禮物的方式追求小娟刨晴。
這里的小林就是我們的代理屉来!
代理模式的目的是: 隱藏真實訪問對象,同時可以處理別的事情
定義
代理模式:為其他對象提供一種代理以控制對這個對象的訪問
也就是說,代理是一個中介, 它連接客戶端和目標(biāo)對象,同時可以附加對種用途
模式結(jié)構(gòu)
例子:
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;
}
優(yōu)點:
在不改變原有代碼的情況下,把類的核心功能和裝飾功能區(qū)分開了,并能動態(tài)擴(kuò)展一個對象的新功能
缺點:
對于多次裝飾的對象,調(diào)試時尋找錯誤可能需要逐級排查蝶桶,較為煩瑣慨绳。