C++設計模式——代理模式
阿新 • • 發佈:2018-12-19
代理模式:為其他物件提供一種代理以控制對這個物件的訪問。這樣實現了業務和核心功能分離。
角色: Subject: 抽象角色。宣告真實物件和代理物件的共同介面。 Proxy: 代理角色。代理物件與真實物件實現相同的介面,所以它能夠在任何時刻都能夠代理真實物件。代理角色內部包含有對真實物件的引用,所以她可以操作真實物件,同時也可以附加其他的操作,相當於對真實物件進行封裝。 RealSubject: 真實角色。它代表著真實物件,是我們最終要引用的物件
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; //商品 class Item { public: Item(string kind, bool fact) { this->kind = kind; this->fact = fact; } string getKind() { return this->kind; } bool getFact() { return this->fact; } private: string kind;//商品的種類 bool fact; //商品的真假 }; // 抽象的購物方式 class Shopping { public: virtual void buy(Item *it) = 0;//抽象的買東西方法 }; //韓國購物 class KoreaShopping :public Shopping { public: virtual void buy(Item *it) { cout << "去韓國買了" << it->getKind()<< endl; } }; //美國購物 class USAShopping :public Shopping { public: virtual void buy(Item *it) { cout << "去美國買了" << it->getKind() << endl; } }; //海外代理 class OverseasProxy :public Shopping { public: OverseasProxy(Shopping *shpping) { this->shopping = shpping; } virtual void buy(Item *it) { //1 辨別商品的真假, //2 進行購買() //3 通過海關安檢,帶回祖國 if (it->getFact() == true) { cout << "1 發現正品, 要購物" << endl; //用傳遞進來的購物方式去購物 shopping->buy(it); //3 安檢 cout << "2 通過海關安檢, 帶回祖國" << endl; } else { cout << "1 發現假貨,不會購買" << endl; } } private: Shopping *shopping; //有一個購物方式 }; int main(void) { //1 辨別商品的真假, //2 進行購買() //3 通過海關安檢,帶回祖國 Item it1("nike鞋", true); Item it2("CET4證書", false); #if 0 // 想去韓國買一個鞋 Shopping *koreaShopping = new KoreaShopping; //1 辨別商品的真偽 if (it1.getFact() == true) { cout << "1 發現正品, 要購物" << endl; //2 去韓國買了這個商品 koreaShopping->buy(&it1); //3 安檢 cout << "2 通過海關安檢, 帶回祖國" << endl; } else { cout << "3 發現假貨,不會購買" << endl; } #endif Shopping *usaShopping = new USAShopping; Shopping *overseaProxy = new OverseasProxy(usaShopping); overseaProxy->buy(&it1); return 0; }
代理模式案例
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //抽象的美女類 class BeautyGirl { public: //1 跟男人拋媚眼 virtual void MakeEyesWithMan() = 0; //2 與男人共度美好的約會 virtual void HappyWithMan() = 0; }; //潘金蓮 class JinLian :public BeautyGirl { public: //1 跟男人拋媚眼 virtual void MakeEyesWithMan() { cout << "潘金蓮拋了一個媚眼" << endl; } //2 與男人共度美好的約會 virtual void HappyWithMan() { cout << "潘金蓮跟你共度約會" << endl; } }; class WangPo :public BeautyGirl { public: WangPo(BeautyGirl *girl) { this->girl = girl; } //1 跟男人拋媚眼 virtual void MakeEyesWithMan() { // ... girl->MakeEyesWithMan(); //... } //2 與男人共度美好的約會 virtual void HappyWithMan() { girl->MakeEyesWithMan(); } private: BeautyGirl *girl; }; //西門大官人 int main(void) { BeautyGirl *jinlian = new JinLian; WangPo *wangpo = new WangPo(jinlian); //向讓潘金蓮拋一個 wangpo->MakeEyesWithMan(); //讓金蓮,月個會 wangpo->HappyWithMan(); return 0; }