Java利用listener实现回调,即观察者模式

java中实现观察者模式有很多种方式,上一篇文章介绍到了,利用callback的方式实现了回调,这篇文章准备介绍的是利用listener实现回调。


Java回调机制

根据实时性划分:
实现方式

这两种实现方式本质上是类似的,应用场景略有不同,如果有熟知安卓的朋友应该可以知道,在为一个view添加点击实现的时候是有两种方式的

  1. 利用callback来实现
view.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View view) {

            }
        });

2.实现View.OnClickListener接口

public class Test extends AppCompatActivity implements View.OnClickListener {
    private Button button;

    @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        button = (Button) findViewById(R.id.ac_video_btn_getValue);
        button.setOnClickListener(this);
    }

    @Override public void onClick(View view) {
        //TODO
    }
}


回调的本质

其实无论哪种方式来实现回调,利用的思想都是观察者模式,即在我们选择订阅之后,当对方做出任何举动的时候会给我们发送一条信息,这样做的好处是省着我们用一个新的线程轮训检测对方的状态,可以节省很多的资源。

应用的场景
  • 如果我们需要将信息一层一层的返回去的时候,正如我下面的例子,那么可能用listener更为适合我们,因为我们可以将这个listener进行传递,在需要查看数据的时候进行回调它。或者当我们有很多事件需要回调的时候,可以实现一个listener然后发送不同的信息,进行区分。这样代码看起来会简洁一些,不会像callback一样,会嵌套很多层,也不会写出很多个callback来。

  • 如果我们只有一处,或者简单的几处需要回调的话,那么我们完全可以不用实现这个接口,而是用callback的方式来进行处理。


还是举一个简单的生活中的例子吧,在公司中有一件事情,老板想要问员工,但是老板只能联系到部门经理,那么便有了,A问B,B问C,C经过思考,回答了B,B又将答案告诉了A,A知道了答案,便高兴的说了出来。


我下面的代码采用了单例模式来写:

Listner.java

public interface Listener {
    void onFinish(String msg);
}
People.java

public class People implements Listener {

    private static People people;

    private People() {

    }

    synchronized public static People getInstance() {
        if (people == null) {
            people = new People();
        }
        return people;
    }

    public void askPeople2() {
        People2.getInstance().askPeople3(this);
    }

    @Override
    public void onFinish(String msg) {
        System.out.println("收到的消息是 ---> " + msg);
    }

}
People2.java

public class People2 {

    private static People2 people2;

    private People2() {

    }

    synchronized public static People2 getInstance() {
        if (people2 == null)
            people2 = new People2();
        return people2;
    }

    public void askPeople3(Listener listener){
        People3.getInstance().thinking(listener);
    }

}
People3.java

public class People3 {

    private static People3 people3;

    private People3() {

    }

    synchronized public static People3 getInstance() {
        if (people3 == null)
            people3 = new People3();
        return people3;
    }

    public void thinking(Listener listener3) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        listener3.onFinish("我已经思考完毕");
    }

}

result

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值