Template Method Pattern

Definition

The template method pattern is a behavioral design pattern that defines the program skeleton of an algorithm in an operation, deferring some steps to subclasses. It lets one redefine certain steps of an algorithm without changing the algorithm’s structure.

Template Method Pattern Class Diagram

Template method’s abstract class may also define hook methods that may be overridden by subclasses.

Implementation

Template Method Abstract Class

public abstract class CaffeineBeverage {

	final void prepareRecipe() {
		boilWater();
		brew();
		pourInCup();
		addCondiments();
	}

	abstract void brew();
	abstract void addCondiments();

	void boilWater() {
		System.out.println("boiling water..");
	}

	void pourInCup() {
		System.out.println("pouring in cup");
	}
}

Concrete Class Coffee & Tea

public class Coffee extends CaffeineBeverage {
	@Override
	void brew() {
		System.out.println("brewing coffee with filter");
	}

	@Override
	void addCondiments() {
		System.out.println("adding sugar");
	}
}
public class Tea extends CaffeineBeverage {

	@Override
	void brew() {
		System.out.println("brewing tea");
	}

	@Override
	void addCondiments() {
		System.out.println("adding lemon");
	}
}

Demo

public class Demo {
	public static void main(String[] args) {
		Arrays.asList(new Tea(), new Coffee())
				.forEach((CaffeineBeverage beverage) -> {
					System.out.println("This is " + beverage.getClass().getSimpleName());
					beverage.prepareRecipe();
				});
	}
}

Arrays Sort Example

public class Duck {
	String name;
	int weight;

	public Duck(String name, int weight) {
		this.name = name;
		this.weight = weight;
	}

	@Override
	public String toString() {
		return "Duck{" +
				"name='" + name + '\'' +
				", weight=" + weight +
				'}';
	}
}
public class Demo {
	public static void main(String[] args) {
		System.out.println("\n\nDuck Sort Example");

		Duck[] ducks = {
			new Duck("Daffy", 8),
			new Duck("Dewey", 2),
			new Duck("Howard", 7),
			new Duck("Louie", 2),
			new Duck("Donald", 10),
			new Duck("Huey", 2)
		};

		System.out.println("Before:");
		Stream.of(ducks).forEach(System.out::println);

		System.out.println("After");
		Arrays.sort(ducks, (Duck o1, Duck o2) -> o1.weight - o2.weight);
		Stream.of(ducks).forEach(System.out::println);
	}
}

Sorting Arrays uses Comparator Interface at sort method internally. It just need to be declared how to compare that object, not how we rearrange the array.

yongmaroo.kim's profile image

yongmaroo.kim

2017-01-01 23:00

Read more posts by this author