java使用接口實現類似C/C++函數指針功能(接口回調)

在一個項目中,如果存在一個設備類,具備多種通信接口,如網口,串口,CAN,IIC,SPI等。而此設備需要提供各種通信接口的打開關閉和讀寫方法。那么我們就可以聲明一個接口包含通信需要的方法定義。然后定義不同的通信接口的實例化方法。這樣設備類實例對象就可以根據實際使用通信接口類型而選擇使用對應的實例化接口。

方法步驟

聲明接口

public interface Drive {
    int open();
    int close();
    int read();
    int write();
}

聲明使用類

public class Device {
    public Drive drive;//定義一個驅動接口。
    Device(Drive drive){
        this.drive = drive;
    }
    Device(){}
    public int open(){
        drive.open();//調用接口方法
        return 0;
    }
    public int close(){
        drive.close();
        return 0;
    }
    public int read(){
        drive.read();
        return 0;
    }
    public int write(){
        drive.write();
        return 0;
    }
}

接口實例化

 Drive drive_1 = new Drive() {
            @Override
            public int open() {
                Log.i(TAG, "open: drive_1");
                return 0;
            }

            @Override
            public int close() {
                Log.i(TAG, "close: drive_1");
                return 0;
            }

            @Override
            public int read() {
                Log.i(TAG, "read: drive_1");
                return 0;
            }

            @Override
            public int write() {
                Log.i(TAG, "write: drive_1");
                return 0;
            }
        };
        Drive drive_2 = new Drive() {
            @Override
            public int open() {
                Log.i(TAG, "open: drive_2");
                return 0;
            }

            @Override
            public int close() {
                Log.i(TAG, "close: drive_2");
                return 0;
            }

            @Override
            public int read() {
                Log.i(TAG, "read: drive_2");
                return 0;
            }

            @Override
            public int write() {
                Log.i(TAG, "write: drive_2");
                return 0;
            }
        };

創建實例對象并對接口成員進行賦值。

        @Override
        public void run() {
            Log.i(TAG, "run: 線程啟動");
            Device device = new Device();
            Log.i(TAG, "run: 使用第一種驅動");
            device.drive = drive_1;
            device.open();
            device.write();
            device.read();
            device.close();
            device.drive = drive_2;
            Log.i(TAG, "run: 使用第二種驅動");
            device.open();
            device.write();
            device.read();
            device.close();
            Log.i(TAG, "run: 線程結束");
        }

當把drive_1賦值給device.drive時調用的是drive_1的實例方法。

09-20 06:47:12.982 9033-9050/? I/TimerThread: open: drive_1
09-20 06:47:12.982 9033-9050/? I/TimerThread: write: drive_1
09-20 06:47:12.982 9033-9050/? I/TimerThread: read: drive_1
09-20 06:47:12.982 9033-9050/? I/TimerThread: close: drive_1

把drive_2賦值給device.drive時調用的是drive_2的實例方法。

09-20 06:47:12.982 9033-9050/? I/TimerThread: open: drive_2
09-20 06:47:12.982 9033-9050/? I/TimerThread: write: drive_2
09-20 06:47:12.982 9033-9050/? I/TimerThread: read: drive_2
09-20 06:47:12.982 9033-9050/? I/TimerThread: close: drive_2

接口回調可以降低程序的耦合度,使程序易于拓展。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容