java - 为什么接口可以实现回调?
大家讲道理
大家讲道理 2017-04-18 10:05:37
0
2
357

don‘t call me ,i will call you,代码怎么就知道什么时机调用呢?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

Antworte allen(2)
黄舟

一般框架都有设置 callback/hook 的接口, 当框架内某个事件发生时, 就会调用用户设置的回调.
例如下面的一个简单例子:

public class CallbackTest {
    public static void main(String args[]) throws Exception {
        // 1. 实例化一个回调逻辑.
        Callback userCallback = new Callback() {
            @Override
            public void call(String message) {
                System.out.println("Call from framework, message: " + message);
            }
        };

        // 2. 初始化一个假象的框架, 并设置用户的回调接口.
        SomeFramework framework = new SomeFramework(userCallback);

        // 3. 启动框架
        framework.start();

        Thread.sleep(5000);
    }

    interface Callback {
        void call(String message);
    }

    static class SomeFramework implements Runnable {
        Callback userCallback;

        public SomeFramework(Callback userCallback) {
            this.userCallback = userCallback;
        }

        public void start() {
            new Thread(this).start();
        }

        @Override
        public void run() {
            try {
                Thread.sleep(3000);
                somethingHappened();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        // 4. 当框架内的状态变化时或者是发生了某个事件时, 就调用用户设置的回调接口.
        private void somethingHappened() {
            userCallback.call("Something happended!");
        }
    }
}

其实就是有点像事件驱动或观察者模式, 框架保存有用户的回调接口, 而这个接口就承担了框架和用户代码沟通的桥梁, 当框架检测到某个事件发生后, 通过此回调接口来通知用户代码.

阿神

约定……约定啊……建议你看看观察者模式

比如你给按钮添加一个 action listener

button.addActionListener(new ActionListener() {
    public actionPerformed(ActionEvent e) {
        // do something
    }
});

约定按钮在按下的时候会触发 action listener,所以你在加的时候,就已经知道了什么时候会调用。虽然不明白具体是哪个时间点,但是你知道如果发生了什么事情,就会调用。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage