=======================================
一 代理模式
1 代理模式概念和好处
(1) 代理模式的本质是自己能干的事情,让别人去做,所以自己必须可
以做这件事
(2) 好处就是别人可以额外的多做一些事情,比如可以现在代理里面
去判断状态,再决定执不执行
2 代理模式的实现原理
(1) 创建一个类,去继承要执行的行为的抽象类,这个类要和行为相关
(2) 然后创建一个代理类,在类里把这个行为定义为私有成员,并用构
造函数初始化它
(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); }