WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

Design Patterns · Expert · question 78 of 100

Explain how the Template Method pattern can be adapted to support the parallel execution of sub-tasks within an algorithm.?

📕 Buy this interview preparation book: 100 Design Patterns questions & answers — PDF + EPUB for $5

The Template Method pattern is a behavioral design pattern that defines the skeleton of an algorithm in a superclass, but lets subclasses override specific steps of the algorithm without changing its structure. The idea behind the Template Method is to let subclasses implement individual steps of an algorithm without letting them change the algorithm’s structure.

Parallelization is a method of improving the performance of an algorithm by breaking down a large task into smaller subtasks that can be executed simultaneously. In order to support parallel execution of sub-tasks within an algorithm, the Template Method pattern can be adapted in the following way:

1. Identify the steps in the algorithm that can be executed in parallel. These steps should be independent of each other and not rely on the output of other steps.

2. Modify the Template Method to use parallel streams for executing the parallelizable steps. Parallel streams are a feature in Java that allows for parallel execution of collections.

3. Create a new abstract method in the superclass that returns the collection of sub-tasks that can be executed in parallel.

4. Implement the new abstract method in the subclass to return a collection of sub-tasks that can be executed in parallel.

5. Override the parallelizable steps in the subclass to execute them in parallel using the parallel streams.

Here is an example of how the Template Method pattern can be adapted to support parallel execution of sub-tasks within an algorithm:

// Abstract superclass with the Template Method
public abstract class Algorithm {
    // ...
    public void execute() {
        // Step 1
        step1();

        // Step 2: parallelizable steps
        Collection<SubTask> subTasks = getParallelizableSubTasks();
        subTasks.parallelStream().forEach(SubTask::execute);

        // Step 3
        step3();
    }

    protected abstract Collection<SubTask> getParallelizableSubTasks();

    protected void step1() {
        // Default implementation
    }

    protected void step3() {
        // Default implementation
    }
}

// Subclass that implements the parallelizable sub-tasks
public class ParallelAlgorithm extends Algorithm {
    // ...
    @Override
    protected Collection<SubTask> getParallelizableSubTasks() {
        Collection<SubTask> subTasks = new ArrayList<>();
        subTasks.add(new SubTask());
        subTasks.add(new SubTask());
        return subTasks;
    }
  
    // Override the parallelizable steps to execute them in parallel
    @Override
    protected void step2() {
        Collection<SubTask> subTasks = getParallelizableSubTasks();
        subTasks.parallelStream().forEach(SubTask::execute);
    }
}

In this example, the ‘Algorithm‘ class defines the Template Method with steps 1, 2, and 3. Step 2 is the parallelizable step, which is modified to use a collection of sub-tasks that can be executed in parallel. The ‘getParallelizableSubTasks()‘ method is defined as abstract in the superclass, and its implementation is provided in the subclass. The ‘step2()‘ method is overridden in the subclass to execute the sub-tasks in parallel using the ‘parallelStream()‘ method.

By adapting the Template Method pattern in this way, we can support parallel execution of sub-tasks within an algorithm and improve its performance.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic Design Patterns interview — then scores it.
📞 Practice Design Patterns — free 15 min
📕 Buy this interview preparation book: 100 Design Patterns questions & answers — PDF + EPUB for $5

All 100 Design Patterns questions · All topics