C++設計模式-代理模式
阿新 • • 發佈:2021-03-27
代理模式-介面隔離
定義:
為其他物件提供一種代理控制(隔離,使用介面)對這個物件的訪問。----《設計模式》GOF
類圖:
使用場景:
在面向物件系統中,有些物件由於某種原因(比如物件建立的開銷很大,或者某些操作需要安全控制,或者需要程序外的訪問等),直接訪問會給使用者、或者系統結構帶來很多麻煩。
解決的問題:
- 在不是去透明操作物件的同時來管理/控制這些物件特有的複雜性;
- 增加一層間接層。
程式碼示例:
#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()操作對使用者進行了隔離。