老板出差,找人代看店咯
今天,老板出差了,临时找了个技艺精湛的师傅帮他看店。 但是,老板有一个要求,一切流程,必须按照他定下来的规则走,烤面包,必须以他的方式来烤,烤肉,也必须以他的方式来,奶油怎么挤、生菜要多大等等都必须按照他的来,以确保顾客吃了之后没有啥反感。
那我们来看一下这个事件中的主要因素:代工师傅、老板、老板的流程,生产出产品。 将这些因素用类图的形式来表述就是如此:
代码实现
代码语言:javascript复制#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 不知道动态那真的是,回炉重造吧。 一般来说,自己写的代理类就是静态的。
动态代理,阔以自己往上翻一翻,一千个读者有一千个哈姆雷特。