1. 程式人生 > >回撥函式正確理解

回撥函式正確理解

回撥過程

簡單理解就是,A呼叫B,然後B在呼叫A

這裡寫圖片描述

對應模型
這裡寫圖片描述

對應程式碼

回撥介面

package callback;

public interface CallBack {
    void backMethod();
}

呼叫者

package callback.other;

import callback.CallBack;

public class Caller implements CallBack{  
    private Called called;  

    public Caller(Called called) {  
        this
.called = called; //註冊回撥,讓被呼叫者能夠呼叫呼叫者的方法 this.called.addRegister(this); } public void request() { System.out.println("這是呼叫者Caller,開始呼叫request方法"); called.specRequest(); } @Override public void backMethod() { System.out.println("回撥方法backMethod,用於調Caller的方法"
); requestSelf(); } //可以使用呼叫者的變數,方法等 public void requestSelf() { System.out.println("呼叫者Caller自身方法requestSelf"); } }

被呼叫者

package callback.other;

import callback.CallBack;

public class Called {

    CallBack CallBack;

    public void addRegister(CallBack CallBack) {
        this
.CallBack = CallBack; } public void specRequest() { System.out.println("這是被呼叫者Called具體的方法specRequest"); //開始回撥 CallBack.backMethod(); } }

測試類

package callback.other;

public class Test {  
    public static void main(String[] args) { 
        //被呼叫者
        Called called = new Called();
        //呼叫者
        Caller caller = new Caller(called);
        //呼叫者發起請求
        caller.request();  
    }  
}  

測試結果

這是呼叫者Caller,開始呼叫request方法
這是被呼叫者Called具體的方法specRequest
回撥方法backMethod,用於調Caller的方法
呼叫者Caller自身方法requestSelf

達到預期回撥效果

回撥函式應用JFrame點選事件

內部類方式

這裡寫圖片描述
對應程式碼

package callback.other;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MyJFrame extends JFrame {

    private static final long serialVersionUID = 1L;

    //初始化一個jlable,通過點選事件改變標籤顯示
    JLabel emptyLable = new JLabel("開始文字");

    public MyJFrame() {
    }

    public void start() {
         //初始化一個jframe
        JFrame frame = new JFrame("測試視窗");

        //初始化一個panel
        JPanel panel = new JPanel();

        //初始化一個容器
        Container container = frame.getContentPane();

        //初始化一個按鈕
        JButton button = new JButton("變變"); 
        button.addActionListener(new ConcreteActionListener());

        //設定佈局
        container.setLayout(new FlowLayout());

        //把按鈕新增到pannel
        panel.add(emptyLable);
        panel.add(button);

        //設定關閉方式
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //把panel新增到容器
        container.add(panel);

        //設定大小
        frame.setSize(600,500);

        //設定位置
        frame.setLocation(100, 100);

        //設定可見性
        frame.setVisible(true);
    }

    //需要回調方法,重新顯示內容
    private void display() {
        emptyLable.setText(System.currentTimeMillis()+"");
    }

    public class ConcreteActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            //回撥
            display();
        }

    }
}

測試程式碼

package callback.other;

public class MyFrame {
    public static void main(String[] args) {
        MyJFrame jFrame = new MyJFrame();
        jFrame.start();
    }

}

測試結果

  1. 第一次結果
    這裡寫圖片描述
  2. 點選結果
    這裡寫圖片描述

呼叫者自身實現回撥介面方式

這裡寫圖片描述
目的是為了簡化例項化物件,減少物件資料,即省略以下程式碼
這裡寫圖片描述

對應程式碼

package callback.other;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MyJFrame extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;

    //初始化一個jlable,通過點選事件改變標籤顯示
    JLabel emptyLable = new JLabel("開始文字");

    public MyJFrame() {
    }

    public void start() {
         //初始化一個jframe
        JFrame frame = new JFrame("測試視窗");

        //初始化一個panel
        JPanel panel = new JPanel();

        //初始化一個容器
        Container container = frame.getContentPane();

        //初始化一個按鈕
        JButton button = new JButton("變變"); 
        button.addActionListener(this);

        //設定佈局
        container.setLayout(new FlowLayout());

        //把按鈕新增到pannel
        panel.add(emptyLable);
        panel.add(button);

        //設定關閉方式
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //把panel新增到容器
        container.add(panel);

        //設定大小
        frame.setSize(600,500);

        //設定位置
        frame.setLocation(100, 100);

        //設定可見性
        frame.setVisible(true);
    }

    //需要回調方法,重新顯示內容
    private void display() {
        emptyLable.setText(System.currentTimeMillis()+"");
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //回撥
        display();
    }

}

測試類

package callback.other;

public class MyFrame {
    public static void main(String[] args) {
        MyJFrame jFrame = new MyJFrame();
        jFrame.start();
    }

}

測試結果

  1. 第一次結果
    這裡寫圖片描述
  2. 點選結果
    這裡寫圖片描述