test4

kaka布鲁斯發表於2024-11-07

如果你希望透過一個抽象類來處理不同型別的資料(例如陣列和列表),而不想為每種型別建立具體的子類,可以在抽象類中直接實現對不同資料型別的處理邏輯。可以透過檢查傳入資料的型別來決定如何處理它們。以下是一個可能的設計:

抽象類設計

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 抽象方法負責,需要子類實現。

這種設計使得一個抽象類可以處理多種資料型別,而不需要為每種資料型別單獨建立子類,從而簡化了類的層級結構和程式碼管理。