大話設計模式(C++)第七章-代理模式
阿新 • • 發佈:2019-02-12
概念
代理模式:為其他物件提供一種代理以控制對這個物件的訪問。
應用場景
(1)遠端代理,也就是為一個物件在不同的地址空間提供區域性代表。這樣可以隱藏一個物件存在於不同地址空間的事實。
(2)虛擬代理,是根據需要建立開銷很大的物件。通過他來存放例項化需要很長時間的真實物件。例如:圖片載入的時候。
(3)安全代理,用來控制真是物件訪問時的許可權。
(4)智慧指引,是指當呼叫真實的物件的時候,代理處理另外一些事。
根本原理:代理模式其實就是在訪問物件的時候引入了一定程度的間接性,因為這種間接性,可以附加多種用途。
#include <iostream> #include <string> //SchoolGirl類 class SchoolGirl { private: std::string name; public: void setName(std::string name) { this->name = name; } std::string getName() { return name; } }; //Subject類,定義了RealSubject和Proxy的共用介面,這樣就可以在任何使用RealSubject的地方使用Proxy class IGiveGift { public: virtual void GiveDolls() = 0; virtual void GiveFlowers() = 0; virtual void GiveChocolate() = 0; }; //RealSubject類,定義了Proxy所代表的真實實體 class Pursuit :public IGiveGift { private: SchoolGirl* mm; public: Pursuit(SchoolGirl* mm) { this->mm = mm; } void GiveDolls() { std::cout << mm->getName() << " 送你洋娃娃" << std::endl; } void GiveFlowers() { std::cout << mm->getName() << " 送你鮮花" << std::endl; } void GiveChocolate() { std::cout << mm->getName() << " 送你巧克力" << std::endl; } }; //Proxy類,儲存一個引用是的代理可以訪問實體,並提供一個與Subject的介面相同的介面,這樣代理就可以用來替代實體 class Proxy :public IGiveGift { private: Pursuit* gg; public: Proxy(SchoolGirl* mm) { gg = new Pursuit(mm); } void GiveDolls() { gg->GiveDolls(); } void GiveFlowers() { gg->GiveFlowers(); } void GiveChocolate() { gg->GiveChocolate(); } }; //Client,客戶端 int main() { SchoolGirl* jiaojiao = new SchoolGirl(); jiaojiao->setName("李嬌嬌"); Proxy* daili = new Proxy(jiaojiao); daili->GiveDolls(); daili->GiveFlowers(); daili->GiveChocolate(); delete jiaojiao; jiaojiao = NULL; delete daili; daili = NULL; return 0; }
此處:jiaojiao指標所指向的物件記憶體和daili指標所指的物件的jiaojiao是同一地址。