回撥函式正確理解
阿新 • • 發佈:2019-02-01
回撥過程
簡單理解就是,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();
}
}
測試結果
- 第一次結果
- 點選結果
呼叫者自身實現回撥介面方式
目的是為了簡化例項化物件,減少物件資料,即省略以下程式碼
對應程式碼
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();
}
}
測試結果
- 第一次結果
- 點選結果