1. 程式人生 > >C++設計模式——代理模式

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

代理模式:為其他物件提供一種代理以控制對這個物件的訪問。這樣實現了業務和核心功能分離。 在這裡插入圖片描述

角色: 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;
}