在一個項目中,如果存在一個設備類,具備多種通信接口,如網口,串口,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
接口回調可以降低程序的耦合度,使程序易于拓展。