代理模式 - 电话虫
代理模式 - 电话虫
苏丙榅1. 电话虫
在海贼中,有一种神奇的通信工具叫做电话虫(Den Den Mushi),外形如蜗牛,身上带有斑点或条纹或通体纯色,壳顶上有对讲机或按键,不接通时会睡觉,接通时会惊醒,并发出“波噜波噜”的声音,在通话时电话虫的嘴巴会如同讲话人的嘴巴一样动,也有人的感情听得懂人类说话,
工作原理是将人的声音转化为电话虫的声音进行长距离传接,经作者尾田荣一郎在SBS上证实这是自然生长的一种虫。
如果拥有了属于对方的电话虫,不论彼此相隔有多远都可以进行时时通信,通过电话虫除了可以听到对方的声音,还能看到对方的表情,妥妥的一个代理人。在设计模式中有一种模式叫做代理模式
,代理模式和电话虫差不多,都是为其他对象提供一种代理,以控制对这个对象的访问。
生活中关于代理的例子也有很多,比如:
- 通过信用卡、微信、支付宝等代替现金支付
- 开发一套对接数据库服务器的接口并提供给客户使用,用于提高服务器的访问效率
- 跑腿小哥代替大聪明给异地的女盆友送花。
- 通过VPN架梯子访问外网。
2. 解构电话虫
如果我们想要用代理模式来描述一下电话虫的行为,里边有如下几个细节:
- 说话的人是一个对象,电话虫也是一个对象,电话虫模拟的是说话的人
- 说话的人和电话虫有相同的行为,所以需要为二者提供一个抽象类
- 电话虫是在为说话的人办事,所以电话虫和说话人应该有关联关系。
根据上面的描述,先把对应的UML类图画一下:
由于电话虫类和讲话者类不是部分与整体的关系,所以这二者的关系是关联关系。
3. 通话
根据上面的UML类图,先把通话的抽象类定义出来:
1 | // 抽象通信类 |
然后在根据这个抽象类,派生出两个子类:讲话者类和电话虫类:
1 | // 讲话的人 |
海贼官方给出的电话虫的名字叫做DenDenMushi
,所以电话虫类也以此命名。
在代理类也就是电话虫类中,一般都会判断是否允许代理(对应示例程序中的isStart()
,表示通话对否开始了),如果允许则通过被代理的对象m_speaker
,调用它的操作函数communicate()
。
最后是测试代码:
1 | int main() |
上面的测试程序中一共使用了两种方式进行通信,第二种使用的是代理模式,我们可以在代理类中有效的管理被代理的对象的工作的时机,但是并没有改变被代理的对象的行为。
通过测试程序我们可以得到如下结论:如果使用代理模式,不能改变所代理的类的接口,使用代理模式的目的是为了加强控制。