C++重寫《大話設計模式》中模式例項六(代理模式)
阿新 • • 發佈:2018-12-13
(宣告:如果想看例項詳細解析,請看《大話設計模式》,這裡文章只是為了加深學習設計模式印象而自己用C++程式寫一遍,以及把程式碼共享給大家。僅僅是把C#語言換成C++表述,不對書中的程式和例子是否合適做個人表述。)
使用代理模式可以避免外部程式直接訪問被代理類,以及減輕代理類的負擔。比如被代理類是一個檔案讀寫類,它在不停地進行檔案讀寫,代理類可以把被代理類讀寫的內容快取。這樣外部的程式想要讀寫檔案可以訪問代理類,而不用直接訪問檔案讀寫類,這樣減輕了檔案讀寫類的負擔,也提高了檔案讀寫的效率。
UML:
SchoolGirl.h
#pragma once #include<iostream> class SchoolGirl { private: char* name; public: SchoolGirl(char* name) { this->name = name; } char* GetName() { return name; } };
Proxy.h
#pragma once #include <iostream> #include "SchoolGirl.h" class IGiveGift { virtual void GiveDolls() = 0; virtual void GiveFlowers() = 0; virtual void GiveChocolate() = 0; }; //追求者類 class Pursuit :public IGiveGift { private: SchoolGirl* mm; public: Pursuit(SchoolGirl* mm) { this->mm = mm; } ~Pursuit() { delete mm; } virtual void GiveDolls() { std::cout << mm->GetName() << ",送你洋娃娃" << std::endl; } virtual void GiveFlowers() { std::cout << mm->GetName() << ",送你鮮花" << std::endl; } virtual void GiveChocolate() { std::cout << mm->GetName() << ",送你巧克力" << std::endl; } }; class Proxy :public IGiveGift { private: Pursuit* gg; public: Proxy(SchoolGirl* mm) { gg = new Pursuit(mm); } ~Proxy() { delete gg; } virtual void GiveDolls() { gg->GiveDolls(); } virtual void GiveFlowers() { gg->GiveFlowers(); } virtual void GiveChocolate() { gg->GiveChocolate(); } };
main.cpp
#include "Proxy.h"
#include <cstdlib>
int main() {
SchoolGirl* jiaojiao = new SchoolGirl("李嬌嬌");
Proxy* daili = new Proxy(jiaojiao);
daili->GiveDolls();
daili->GiveFlowers();
daili->GiveChocolate();
delete daili;
system("pause");
return 0;
}
執行結果: