qq_20399407 2015-08-11 11:36 采纳率: 50%
浏览 2239
已采纳

请问大神们指点一下关于C++代理(委托)设计模式的问题

static void function()
{
printf("this is a function\n");
}

class Fun
{
public:
virtual void func() = 0;
};

class RealFun : public Fun
{
public:
void func()
{
function();
}
};

class DelegateFun :public Fun
{
public:
RealFun *realFun;
DelegateFun()
{
realFun = new RealFun;
}
void func()
{
realFun->func();
printf("this is a delegate\n");
}
};

int _tmain(int argc, _TCHAR* argv[])
{
DelegateFun delegateFun;
delegateFun.func();
getchar();
return 0;
}
我想问一下我这个简单的例子算不算代理设计模式,这样是不是绑定了全局函数

  • 写回答

2条回答 默认 最新

  • threenewbee 2015-08-11 14:08
    关注

    可以算代理模式,但是你要知道什么情况下用代理模式。

    代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    你的程序中一个全局函数,写一个代理模式,这个叫做画蛇添足。我可以给你一个实际的场景,你体会下。

    比如你有一个函数,fun();
    你原先直接调用它就好了。

    现在我们需要改一改,这个函数我们放在服务器上,而你的调用放在另一个客户计算机上。
    现在的问题来了,都不是一个计算机,你怎么调用服务器上的这个函数呢?
    你想到了一个办法,服务器上用socket监听一个端口,如果有别的计算机和它通讯,告诉它应该调用fun,并且传什么参数,这个网路通讯的程序就去调用fun(),传入参数,并且把fun()的结果通过网络返回客户端。

    客户端怎么做?因为问题转化为网络通讯了,而不是调用函数了,当然,你可以直接写死,怎么发数据,怎么收数据。这样就完成了功能。

    但是你也可以用代理模式封装一下,做法和服务器的socket类似,你也写一个函数,叫fun(),表面上看它和服务器上的那个一样,但是它不实际实现fun()真正的功能,而是接受传入的参数,开一个网络连接,发送函数调用的请求,服务器返回的数据作为它的返回再返回。

    这样你的客户端调用这个客户端上的fun()感觉好像是这个fun()就是一个实际有功能的函数一样,这就是代理模式的用处。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝