MST

星途 面试题库

面试题:Java模板方法模式在复杂批量数据处理场景下如何与其他设计模式协同

假设存在一个复杂的批量数据处理场景,不仅需要对数据进行常规的转换、计算等操作,还需要根据不同的数据来源和业务规则进行灵活处理。请详细说明如何将模板方法模式与策略模式、观察者模式等其他设计模式协同使用,以实现高可维护性、可扩展性的系统架构,并绘制简单的架构图辅助说明。
29.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 模板方法模式:定义一个处理数据的模板方法,包含数据处理的整体流程框架,如读取数据、处理数据、存储结果等步骤,其中部分具体步骤可以延迟到子类实现。例如:
abstract class DataProcessingTemplate {
    public final void processData() {
        List<Data> data = readData();
        List<ProcessedData> processedData = process(data);
        saveResults(processedData);
    }

    protected abstract List<Data> readData();
    protected abstract List<ProcessedData> process(List<Data> data);
    protected abstract void saveResults(List<ProcessedData> processedData);
}
  1. 策略模式:对于根据不同数据来源和业务规则的灵活处理部分,使用策略模式。将每个具体的处理逻辑封装成一个策略类,实现相同的策略接口。比如对于不同来源数据的转换策略:
interface DataTransformationStrategy {
    Data transform(Data data);
}

class SourceADataTransformationStrategy implements DataTransformationStrategy {
    @Override
    public Data transform(Data data) {
        // 针对来源A的数据转换逻辑
    }
}

class SourceBDataTransformationStrategy implements DataTransformationStrategy {
    @Override
    public Data transform(Data data) {
        // 针对来源B的数据转换逻辑
    }
}

在模板方法的process步骤中,可以根据数据来源选择不同的策略。

class SpecificDataProcessing extends DataProcessingTemplate {
    private DataTransformationStrategy strategy;

    public SpecificDataProcessing(DataTransformationStrategy strategy) {
        this.strategy = strategy;
    }

    @Override
    protected List<Data> readData() {
        // 读取数据逻辑
    }

    @Override
    protected List<ProcessedData> process(List<Data> data) {
        List<ProcessedData> result = new ArrayList<>();
        for (Data d : data) {
            Data transformed = strategy.transform(d);
            // 进一步处理并添加到结果列表
        }
        return result;
    }

    @Override
    protected void saveResults(List<ProcessedData> processedData) {
        // 存储结果逻辑
    }
}
  1. 观察者模式:用于在数据处理过程中,当某些关键事件发生时通知相关的观察者。比如当数据处理完成后通知监控系统。
interface Observer {
    void update();
}

class MonitoringSystem implements Observer {
    @Override
    public void update() {
        // 监控系统更新逻辑,如记录日志、发送通知等
    }
}

class DataProcessingSubject {
    private List<Observer> observers = new ArrayList<>();

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void detach(Observer observer) {
        observers.remove(observer);
    }

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}

在模板方法的saveResults步骤完成后,可以调用notifyObservers通知观察者。

class FinalDataProcessing extends DataProcessingTemplate {
    private DataProcessingSubject subject;

    public FinalDataProcessing(DataProcessingSubject subject) {
        this.subject = subject;
    }

    @Override
    protected List<Data> readData() {
        // 读取数据逻辑
    }

    @Override
    protected List<ProcessedData> process(List<Data> data) {
        // 处理数据逻辑
    }

    @Override
    protected void saveResults(List<ProcessedData> processedData) {
        // 存储结果逻辑
        subject.notifyObservers();
    }
}

架构图

graph TD;
    A[客户端] --> B[DataProcessingTemplate]
    B --> C[SpecificDataProcessing]
    C --> D[DataTransformationStrategy]
    D --> E1[SourceADataTransformationStrategy]
    D --> E2[SourceBDataTransformationStrategy]
    B --> F[FinalDataProcessing]
    F --> G[DataProcessingSubject]
    G --> H[MonitoringSystem]

在架构图中,客户端调用DataProcessingTemplate及其子类SpecificDataProcessingFinalDataProcessing进行数据处理。SpecificDataProcessing依赖DataTransformationStrategy及其具体实现类进行数据转换策略选择。FinalDataProcessing关联DataProcessingSubjectDataProcessingSubjectMonitoringSystem(观察者)交互,实现事件通知。通过这种方式,结合三种设计模式,实现了高可维护性、可扩展性的系统架构。