C++設計模式 - 代理模式詳解二
阿新 • • 發佈:2018-12-24
- 5.遊戲代練收費
上一篇文章提到了小明請遊戲代練來幫助自己打遊戲升級,但是遊戲代練也不是白幫你玩的,小明需要付費給遊戲代練。
咱們定義一個付費的介面基類。
class ICost {
public:
ICost();
~ICost();
virtual void money();
};
#include "ICost.h"
ICost::ICost() {
}
ICost::~ICost() {
}
void ICost::money() {
然後讓遊戲代練繼承這個介面,並且實現這個介面
class ProxyStudentPlayer :public IPlayer, public ICost { public: ProxyStudentPlayer(std::string name, std::string account, std::string pwd); ProxyStudentPlayer(std::string name,IPlayer* player); ~ProxyStudentPlayer(); //登入遊戲 void login()override; //玩遊戲 void play()override; //升級 void update()override; //退出登入 void logout()override; //遊戲代練費用 void money()override; private: std::string _proxyName; IPlayer* _studentPlayer; };
ProxyStudentPlayer::ProxyStudentPlayer(std::string name, std::string account, std::string pwd) :IPlayer(account, pwd) { _proxyName = name; _studentPlayer = new StudentPlayer(account, pwd); } ProxyStudentPlayer::ProxyStudentPlayer(std::string name, IPlayer* player) { _proxyName = name; _studentPlayer = player; } ProxyStudentPlayer::~ProxyStudentPlayer() { } void ProxyStudentPlayer::login() { printf("遊戲代理:%s 使用", _proxyName.c_str()); _studentPlayer->login(); } void ProxyStudentPlayer::play() { printf("遊戲代理:%s 使用", _proxyName.c_str()); _studentPlayer->play(); } void ProxyStudentPlayer::update() { printf("遊戲代理:%s 使用", _proxyName.c_str()); _studentPlayer->update(); } void ProxyStudentPlayer::logout() { money(); printf("遊戲代理:%s 使用", _proxyName.c_str()); _studentPlayer->logout(); } void ProxyStudentPlayer::money() { printf("本次遊戲代練需要費用:200元\n"); }
通過程式碼可以看出,在由此代練退出賬號的時候,會呼叫介面money()這個方法,計算出這個遊戲代練需要費用,然後去找小明索取。
客戶端程式碼不用修改,咱們直接執行一下看看結果:
通過以上示例可以看出,真實的物件和客戶端都沒有修改,只是修改了代理類,就完成了費用計算的功能。
這樣做就解耦物件的核心功能和非核心功能。通過在代理類上新增一些非核心功能實現真實物件的功能擴充套件。