1. 程式人生 > 其它 >C++設計模式-代理模式

C++設計模式-代理模式

代理模式-介面隔離

定義:
為其他物件提供一種代理控制(隔離,使用介面)對這個物件的訪問。----《設計模式》GOF

類圖:
代理模式類圖
使用場景:
在面向物件系統中,有些物件由於某種原因(比如物件建立的開銷很大,或者某些操作需要安全控制,或者需要程序外的訪問等),直接訪問會給使用者、或者系統結構帶來很多麻煩。

解決的問題:

  1. 在不是去透明操作物件的同時來管理/控制這些物件特有的複雜性;
  2. 增加一層間接層。

程式碼示例:

#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; }

小結:
Item類中為我們所要在代理中新增的功能,我們將所要進行的事情進行抽象,抽象成Shopping類,我們根據類圖可以設計一個代理是繼承自Shopping。這樣就可以在代理類中對原本buy()操作前後加上其它操作,這樣在客戶訪問buy()操作的時候就需要進行代理中所加的新的功能,將原本buy()操作對使用者進行了隔離。