_006_代理模式

=======================================


一 代理模式


1 代理模式概念和好处

(1) 代理模式的本质是自己能干的事情,让别人去做,所以自己必须可

以做这件事

(2) 好处就是别人可以额外的多做一些事情,比如可以现在代理里面

去判断状态,再决定执不执行


2 代理模式的实现原理

(1) 创建一个类,去继承要执行的行为的抽象类,这个类要和行为相关

(2) 然后创建一个代理类,在类里把这个行为定义为私有成员,并用构

造函数初始化它

扫描二维码关注公众号,回复: 1523102 查看本文章

(3) 去实现这个抽象类中的函数,然后在这个函数里面,

用我们的私有成员去调用抽象类中的虚函数,


我们看到第3条有点绕,仿佛是有点绕循环了,其实这就是为行为套一层

壳,具体我们看代码


3 代理模式代码

#include <iostream>
#include <string>
using namespace std;

class Thing
{
public:
	Thing(string str) :name(str){}
	string getName()
	{
		return name;
	}
private:
	string name;
};


class Shopping
{
public:
	virtual void buy(Thing) = 0;
};

class USAShopping:public Shopping
{
public:
	void buy(Thing t1)
	{
		cout << "USA" << t1.getName();
    }
};

class ChinaShopping :public Shopping
{
public:
	void buy(Thing t1)
	{
		cout << "China" << t1.getName();
	}
};

//创建一个代理类,用来套一层壳
class myProxy:public Shopping
{
public:

	//初始化Shopping,知道要去哪买
	myProxy(Shopping* sp) :sp(sp){}

	//重写Shopping的buy方法,知道要买什么
	virtual void buy(Thing t1) override
	{
		//用我们的私有成员shopping来买,买什么由我们指定,相当于套了一层壳
		cout << "买之前可以做其它的事情" << endl;
		sp->buy(t1);
		cout << "买之后还可以做其它的事情" << endl;
	}
private:

	//虽然是套一层壳,但是内部还是一样,还是需要创建一个Shopping
	Shopping* sp;
};

int main()
{
	Shopping *sp1 = new USAShopping;
	myProxy *p1 = new myProxy(sp1);
	Thing t1("飞机杯");
	p1->buy(t1);
}

我们可以看到

Shopping *sp1 = new USAShopping;

myProxy *p1 = new myProxy(sp1);

这并不是很绕,而是利用多态,myProxy的参数是Shopping类型

用来初始化我们私有的Shopping类,

然后利用Shopping类调用buy(t1),传入的t1是我们的商品

在内部还是相当于是 USAShopping调用了buy,只不过我们套了一层


4 代理模式额外案例

(1)模仿一个ip代理

#include <iostream>
#include <string>
using namespace std;

//上网的抽象类
class Internet
{
public:
	virtual void toWeb(MyIp) = 0;
};


class MyIp
{
public:
	MyIp(int ip) :ip(ip){}
	int getIP(){ return ip; }
private:
	int ip;
};

//登录QQ和上网有关,继承并实现Internet
class 登录QQ :public Internet
{
public:
	void toWeb(MyIp ip)
	{
		cout << "登录QQ" << ip.getIP() << endl;;
	}
};

//创建一个代理类, 在类里把这个行为定义为私有成员,并用构
//造函数初始化它
class myProxy :public Internet
{
public:

	//构造函数初始化私有成员
	myProxy(Internet *it) :it(it){}

	//实现这个抽象类中的函数
	virtual void toWeb(MyIp ip) override
	{
		//最后在这个函数里面,用我们的私有成员去调用抽象类中的虚函数
		MyIp ip_proxy(10000);
		it->toWeb(ip_proxy);

		//我们可以不用自己的ip,只是传进来,作为一个连接作用
		//可以用代理的ip,然后ip访问了页面之后把内容返回给我们
	}


private:

	//把这个行为定义为私有成员
	Internet *it;
};

int main()
{
	Internet *it = new 登录QQ;
	MyIp m1(101010);
	it->toWeb(m1);
}









猜你喜欢

转载自blog.csdn.net/yzj17025693/article/details/80588756