java 信号 槽_信号和槽和javalistener对比

谈谈信号和槽和java listener的对比。这里并不是一个全面的对比,主要是想就其中一点展开来谈一谈。

简述

可能有朋友对其中一种不太熟悉。信号和槽、java listener 本质上都是一种发布/订阅模式。

具体实现

信号和槽看起来是这样:

class Sender: Object {

// 定义信号

public signal void some_event(int data);

public void emit_event(int data) {

some_event(data);

}

}

class Receiver: Object {

// 槽函数

public void handler(int data) {

stdout.printf("received data: %d\n", data);

}

}

void main() {

var sender = new Sender();

var receiver = new Receiver();

sender.some_event.connect(receiver.handler);

sender.emit_event(32);

}

上面这段代码用 vala 写成的。其它的如 qt 也只是写法不同,但是本质上还是一样的。运行结果:

received data: 32

java listener

public interface IListener {

void some_event(int data);

}

public class Sender {

private IListener listener;

public void setListener(IListener listener) {

this.listener = listener;

}

public void emit_event(int data) {

if (listener != null)

listener.some_event(data);

}

}

public class Receiver implements IListener {

@Override

public void some_event(int data) {

System.out.println("received data: " \+ data);

}

}

public class App {

public static void main(String\[\] args) {

Sender sender = new Sender();

Receiver receiver = new Receiver();

sender.setListener(receiver);

sender.emit_event(32);

}

}

执行结果:

received data: 32

二者实现的功能是一模一样的。但其中又有细微差别,看出差别在哪里了吗?

信号的定义和 listener 接口的定义相似,但是槽的优点在于:不需要显示申明实现 listener 接口,只要参数类型和顺序一致即可,也没有方法名的约束。换句话说,只要参数类型和顺序相同,都可以认为是该接口的实现,是不是有点像 go 的接口?

这个功能带来了很高的灵活性,比如某个信号要触发一个功能,这个功能在已有的库已经写好了,并且参数类型和顺序一致,我们只需要简单的连接一下即可,不再需要任何多余的粘合代码。

文章来源: www.oschina.net,作者:如果改个名字,版权归原作者所有,如需转载,请联系作者。

原文链接:https://my.oschina.net/u/4249715/blog/3182815

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值