函数对象/Functor/Function Object与接口Interface的选择问题

1 篇文章 0 订阅
 

一般来讲,使用函数对象的场合可以用接口实现,而使用接口的地方也可以使用多个函数对象来实现,但有些情况使用一种比另一种更好。

1,当多个调用紧密不宜分离,且希望通知到同一个接收者时,使用接口可以避免混淆。

比如一个接口要接收的消息包括:连接成功、收到数据、接收超时、连接中断等消息,这些消息和某个连接相关联,一般来讲,需要同一个对象来处理。如果用函数对象,可能接收这些消息的对象很分散,是不良的设计。

2,当多个调用使用同一个接口类型,且希望同一个对象接收这些调用,则只能通过函数的参数来分辨是哪个调用。此时更宜使用函数对象,可以指定同一个类的不同函数来接收不同的调用,避免判断参数。总结一下简单的判断依据,当如下两种情况发生是,可能使用函数对象会更好(只是说可能,具体情况具体分析):

(1),发现函数中不能区分调用来源时;

(2),发现函数中必须通过判断参数才能知道调用来源时。

当然,也可以使用多个对象分别实现接口,然后分别传递,这比较麻烦。

比如,我的一个对象中有2个计时器,第一个计时器到时执行操作1,第二个执行操作2,如果用接口,则操作1和操作2使用同一个函数,需要通过参数来判断是计时器1发生还是计时器2发生,如果使用函数对象,则使用两个不同的函数来接收不同计时器的发生消息。

3,函数对象比较简单灵活,免去了实现接口以及虚函数等麻烦。

4,当一个接口中只有一个函数时,可以考虑使用函数对象。

5,需要记录参数时:函数对象可以封装参数(函数对象有两种,也有一种不封装参数的),调用时不必再传递参数;而接口在调用时必须传递参数,或者接口实现者自己把参数先记录下来,这就多处了很多麻烦且可能出现错误。

举一个最简单的例子,我们如果要启动新线程,新线程的入口函数可以没有参数,也可能我们希望传递个参数给入口函数,此时如果用接口,则实现对象需要把参数保存在成员变量里,然后函数调用时取成员变量(需要注意加锁)。而如果传递函数对象给线程启动器,参数封装在函数对象里,省去很多麻烦。

6,在具体语言C++中,有个特殊的情况,函数对象不容易得知接收对象是否已经销毁(可以知道,只是麻烦一些),而接口可以在析构的时候从被监听者撤销监听。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值