专门做各种产品测评的网站,网页设计素材和制作教程,腾讯云服务器cvm,wordpress 旅游主题1. 电话虫 在海贼中#xff0c;有一种神奇的通信工具叫做电话虫#xff08;Den Den Mushi#xff09;#xff0c;外形如蜗牛#xff0c;身上带有斑点或条纹或通体纯色#xff0c;壳顶上有对讲机或按键#xff0c;不接通时会睡觉#xff0c;接通时会惊醒#xff0c;并发…1. 电话虫 在海贼中有一种神奇的通信工具叫做电话虫Den Den Mushi外形如蜗牛身上带有斑点或条纹或通体纯色壳顶上有对讲机或按键不接通时会睡觉接通时会惊醒并发出“波噜波噜”的声音在通话时电话虫的嘴巴会如同讲话人的嘴巴一样动也有人的感情听得懂人类说话工作原理是将人的声音转化为电话虫的声音进行长距离传接经作者尾田荣一郎在SBS上证实这是自然生长的一种虫。 如果拥有了属于对方的电话虫不论彼此相隔有多远都可以进行时时通信通过电话虫除了可以听到对方的声音还能看到对方的表情妥妥的一个代理人。在设计模式中有一种模式叫做代理模式代理模式和电话虫差不多都是为其他对象提供一种代理以控制对这个对象的访问。
生活中关于代理的例子也有很多比如
通过信用卡、微信、支付宝等代替现金支付开发一套对接数据库服务器的接口并提供给客户使用用于提高服务器的访问效率跑腿小哥代替大聪明给异地的女盆友送花。通过VPN架梯子访问外网。
2. 解构电话虫
如果我们想要用代理模式来描述一下电话虫的行为里边有如下几个细节
说话的人是一个对象电话虫也是一个对象电话虫模拟的是说话的人说话的人和电话虫有相同的行为所以需要为二者提供一个抽象类电话虫是在为说话的人办事所以电话虫和说话人应该有关联关系。
根据上面的描述先把对应的UML类图画一下: 由于电话虫类和讲话者类不是部分与整体的关系所以这二者的关系是关联关系。
3. 通话
根据上面的UML类图先把通话的抽象类定义出来:
// 抽象通信类
class Communication
{
public:virtual void communicate() 0; // 通话virtual ~Communication() {}
};然后在根据这个抽象类派生出两个子类讲话者类和电话虫类
// 讲话的人
class Speaker : public Communication
{
public:void communicate() override{cout 开始说话... endl;cout 通话时发生了一些列的表情变化... endl;}
};// 电话虫
class DenDenMushi : public Communication
{
public:DenDenMushi(){m_isStart true;m_speaker new Speaker;}~DenDenMushi(){if (m_speaker ! nullptr){delete m_speaker;}}// 判断是否已经开始通话了bool isStart(){return m_isStart;}void communicate() override{if (isStart()){// 得到通话者语言和表情信息, 并加以模仿cout 电话虫开始实时模仿通话者的语言和表情... endl;m_speaker-communicate();}}
private:bool m_isStart false;Speaker* m_speaker nullptr;
};海贼官方给出的电话虫的名字叫做DenDenMushi所以电话虫类也以此命名。
在代理类也就是电话虫类中一般都会判断是否允许代理对应示例程序中的isStart()表示通话对否开始了如果允许则通过被代理的对象m_speaker调用它的操作函数communicate() 。
最后是测试代码
int main()
{// 直接交流Communication* comm new Speaker;comm-communicate();delete comm;cout endl;// 使用电话虫comm new DenDenMushi;comm-communicate();delete comm;return 0;
} 上面的测试程序中一共使用了两种方式进行通信第二种使用的是代理模式我们可以在代理类中有效的管理被代理的对象的工作的时机但是并没有改变被代理的对象的行为。 原文链接: https://subingwen.cn/design-patterns/proxy/#3-%E9%80%9A%E8%AF%9D