如果你希望透過一個抽象類來處理不同型別的資料(例如陣列和列表),而不想為每種型別建立具體的子類,可以在抽象類中直接實現對不同資料型別的處理邏輯。可以透過檢查傳入資料的型別來決定如何處理它們。以下是一個可能的設計:
抽象類設計
import java.util.List;
public abstract class AbstractDataProcessor {
// 處理資料的通用方法
public final void processData(Object data) {
if (data instanceof Object[]) {
processArray((Object[]) data);
} else if (data instanceof List) {
processList((List<?>) data);
} else {
throw new IllegalArgumentException("Unsupported data type: " + data.getClass());
}
generateColumns(); // 生成列(預設實現或子類覆蓋)
generateReport(); // 生成報告(由子類實現)
}
// 陣列資料處理的具體邏輯
private void processArray(Object[] data) {
System.out.println("Processing array data...");
for (Object obj : data) {
processDataItem(obj);
}
}
// 列表資料處理的具體邏輯
private void processList(List<?> data) {
System.out.println("Processing list data...");
for (Object obj : data) {
processDataItem(obj);
}
}
// 處理單個資料項的抽象方法,由子類實現
protected abstract void processDataItem(Object item);
// 生成列的通用方法,子類可以覆蓋
protected void generateColumns() {
System.out.println("Generating default columns...");
}
// 抽象方法:由子類實現具體的報告生成邏輯
protected abstract void generateReport();
}
使用示例
public class ConcreteDataProcessor extends AbstractDataProcessor {
@Override
protected void processDataItem(Object item) {
System.out.println("Processing item: " + item);
// 實現單個資料項的處理邏輯
}
@Override
protected void generateReport() {
System.out.println("Generating report for processed data...");
// 實現報告生成邏輯
}
}
public class DataProcessorExample {
public static void main(String[] args) {
AbstractDataProcessor processor = new ConcreteDataProcessor();
// 處理陣列資料
Object[] arrayData = {1, 2, 3};
processor.processData(arrayData);
// 處理列表資料
List<Object> listData = List.of("a", "b", "c");
processor.processData(listData);
}
}
設計說明
- 資料型別判斷:在
processData
方法中透過instanceof
判斷資料型別,然後呼叫相應的私有方法處理具體的資料型別。 - 單個資料項處理:透過
processDataItem
抽象方法,允許子類定義如何處理每個資料項。 - 列生成和報告生成:提供了預設的列生成方法
generateColumns
,可以被子類覆蓋。報告生成由generateReport
抽象方法負責,需要子類實現。
這種設計使得一個抽象類可以處理多種資料型別,而不需要為每種資料型別單獨建立子類,從而簡化了類的層級結構和程式碼管理。