首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

学以致用C++设计模式 之 “代理模式”

老板出差,找人代看店咯

今天,老板出差了,临时找了个技艺精湛的师傅帮他看店。 但是,老板有一个要求,一切流程,必须按照他定下来的规则走,烤面包,必须以他的方式来烤,烤肉,也必须以他的方式来,奶油怎么挤、生菜要多大等等都必须按照他的来,以确保顾客吃了之后没有啥反感。

那我们来看一下这个事件中的主要因素:代工师傅、老板、老板的流程,生产出产品。 将这些因素用类图的形式来表述就是如此:

代码实现

#include<iostream>

using namespace std;

//抽象主题
class abstractMan {
public:
	virtual void run() = 0;
};

class boss :public abstractMan {
public:
	void bread() { cout << "bread" << endl; }
	void roast() { cout << "roust" << endl; }
	
	void run() {
		//暂时不插其他模式,后面会有组合模式
		bread();
		roast();
	}
};

//代理
class proxy :public abstractMan {
public:
	proxy(abstractMan* temp) { a = temp; }
	void before(){
		//该干嘛干嘛
	}
	void after(){
		//爱干嘛干嘛
	}

	void run() { 
		before();
		a->run();
		after();
	}
private:
	abstractMan* a;
};

//场景
int main()
{
	abstractMan* bs = new boss();
	proxy* pro = new proxy(bs);
	pro->run();
}

代码是比较精简,可能比不上你们在其他地方看到的,但是我是把最精简的部分抓出来自己写的。

写时感悟

刚开始我不知道它干嘛用的,但是后面我发现,这个模式解耦合的效果特别的好,而且还保护了它的“客户信息”。 及场景类并不需要知道具体实现类的实现,甚至都不需要知道代理类的实现,场景只需要知道有个代理很流弊,这个代理有个run方法很流弊,就够了。

就像去吃东西的顾客,他们并不需要知道老板是谁,也不需要知道汉堡怎么做的,他们只需要知道跟那个师傅说一声,把钱放下,汉堡就来了。老板也不需要知道谁来吃东西,反正最后钱收一下就完了。

然后代理里面的before和after方法,就是给代理的自由权限。

代理模式的应用

一个代理类可以代理多个委托,因此代理类具体执行那个委托者的工作,由场景类把控。

代理模式的优点

  • 职责清晰
  • 高拓展性
  • 智能化

代理模式拓展

  • 普通代理 客户端只能访问代理角色,而不能访问其他真实角色,这是比较简单的。
  • 强制代理 这个比较奇葩一点,一般的思维都是通过代理找到真实的角色,但是强制代理确实要“强制”,你必须通过真实角色查找到代理角色,否则你不能访问。

比方说:今天老板不在,但是我就是想让老板亲自给我做,因为那个师傅做的不好吃,正巧老板娘在,于是我就跟老板娘说:“妹儿啊,你老公呢?我找他有点事儿啊”,结果老板娘说:“哎,哥啊,莫得办法呀,他这两天劳累过度啊,要不你还是让师傅给你做吧”。 你看,我本来要绕过这个师傅直接让老板来,结果兜了一圈,又兜回来了。。。 这就是强制代理。

如果有兴趣,可以自己去实现一下这个强制代理。 当然,没兴趣的话可以实现以下这个:这个师傅啊,早上当代驾,中午在汉堡店代老板做汉堡,下午去给某个十八线小明星做替身,晚上又回来做汉堡,可真够忙啊,实现一下,学以致用,马上用!!!

GoGoGoGoGo!!!

  • 动态代理 什么是动态代理?就是在编译的时候不用知道代理谁,直到运行到的时候才选定。 学C++不知道动态那真的是,回炉重造吧。 一般来说,自己写的代理类就是静态的。

动态代理,阔以自己往上翻一翻,一千个读者有一千个哈姆雷特。

下一篇
举报
领券