前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java设计模式(二)回调模式

Java设计模式(二)回调模式

作者头像
每天学Java
发布2020-06-01 17:50:12
8790
发布2020-06-01 17:50:12
举报
文章被收录于专栏:每天学Java

在学习Java的路上很早很早就接触了回调,比如:JFrame的键盘事件,JFrame控件的点击事件,线程池执行之前的方法beforeExecute与执行之后的方法 afterExecute,线程的Run方法其原理就是使用了回调。之前一直没有研究过其原理,在这里学习一下回调模式,也方便理解事件监听模式和观察者模式。

回调模式

在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序

可能会有这样一个需求,某开发者想在线程执行之前和执行之后分别做一些事情,你可能想到的方法就是在线程的run方法体内做这些操作,这样固然能实现,可是却使得各种业务耦合在一起。最好的解决方法就是使用回调模式。

定义一个抽象类ThreadHolder 在抽象类中有三个方法

  1. 线程执行的run方法
  2. beforeRun为线程执行之前调用的方法
  3. afterRun为线程执行完成之后调用的方法
代码语言:javascript
复制
abstract class ThreadHolder {

    public final void run(Runnable runnable) {
        Objects.requireNonNull(runnable, "runnable required not null");
        beforeRun();
        runnable.run();
        afterRun();
    }

    /**
     * 在线程执行之前执行
     */
    protected void beforeRun() {
    }

    /**
     * 在线程执行完之后执行
     */
    protected void afterRun() {
    }
}

然后实现一个简单的线程任务,继承ThreadHolder 并重写beforeRun和afterRun方法

代码语言:javascript
复制
class simpleThread extends ThreadHolder {

    @Override
    protected void beforeRun() {
        System.out.println("执行之前。。。");
    }

    @Override
    protected void afterRun() {
        System.out.println("执行之后。。。");
    }
}</span class="hljs-inheritance">

测试

代码语言:javascript
复制
public class AppTest {
    public static void main(String[] args) {
        simpleThread simpleThread = new simpleThread();
        simpleThread.run(() -> {
            int n = 10;
            for (int i = 0; i < n; i++) {
                System.out.println("current num is :" + i);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

测试结果:

执行之前。。。 current num is :0 current num is :1 current num is :2 current num is :3 current num is :4 current num is :5 current num is :6 current num is :7 current num is :8 current num is :9 执行之后。。。

解释:

  • ThreadHolder 抽象类run方法决定了在线程的执行前后分别调用beforeRun、afterRun方法
  • simpleThread 重写beforeRun方法和afterRun方法,在方法体中做一些事情
  • AppTest 中向run方法中传递线程对象

通过这个实例,我们可以看到使用回调模式实现了我们的功能。在底层代码,即ThreadHolder中我们就制定了空方法执行顺序,在高层重写空的方法,然后在执行时我们实现的方法就会被底层调用。


今天小程序更新的题库:(在文章结束稍稍提及一点,题库的作用其实并非完全是为了面试,更多的是让我们进行知识的扩展。)

1.回调模式在不在23中设计模式当中?

2.23种设计模式你能罗列出来几种?

3.设计模式遵循的原则你知道吗?

4.有没有对ThreadLocal与线程同步机制进行比较?

5.你知道Netty关于ThreadLocal机制的优化吗?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 每天学Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 回调模式
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档