Android NDK程序员终端研发部

java使用接口实现类似C/C++函数指针功能(接口回调)

2017-10-17  本文已影响108人  桂慧要努力当个攻城师

在一个项目中,如果存在一个设备类,具备多种通信接口,如网口,串口,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

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

上一篇下一篇

猜你喜欢

热点阅读