DEV Community

Oluwasanmi Aderibigbe
Oluwasanmi Aderibigbe

Posted on

2 1

Head First Design Pattern: 7 of 10

I just learnt a new design from the Head First Design Pattern book. Today, I learnt about the Template pattern.

According Head First Design Patterns, The template pattern is a pattern used to define the skeleton of an algorithm in a method(Template method), deferring some steps to subclasses. Template pattern lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.

For example you were asked to develop an app for making different kinds of burgers. Making burgers for the most part require the same steps. You could create a class for each burger you'd like to create or you could reuse code by implementing the template pattern.

Implementing the Template pattern is pretty straightforward.

1 First you have define the algorithm in an abstract class. Methods that must be implemented by the subclasses are marked as abstract.

abstract class Burger {
    abstract fun grillMeat()
    abstract fun addToppings()
    fun makePatties() {
        println("warming buns")
    }

    open fun deliver() {}

    fun prepareBurger() {
        makePatties()
        grillMeat()
        addToppings()
        deliver()
    }
}

Enter fullscreen mode Exit fullscreen mode

2 Subclass the template class and provide the required behaviour

class ChickenBurger : Burger() {
    override fun grillMeat() {
        println("Grill chicken")
    }

    override fun addToppings() {
        println("Add things needed for chicken burger")
    }
}

class HamBurger : Burger() {
    override fun grillMeat() {
        println("Grill chicken")
    }

    override fun addToppings() {
        println("Add things needed for ham burger")
    }
}
Enter fullscreen mode Exit fullscreen mode

With the Template pattern we reused code by moving almost everything required to make a burger into an abstract super class and then allow subclasses provide the missing steps.

The Template pattern can be improved by adding hooks. Hooks are essentially methods with default or empty implementation. They give the subclasses the ability to hook into the algorithm at various points. Hooks are somewhat of callbacks so to speak.

abstract class Burger {
    abstract fun grillMeat()
    abstract fun addToppings()
    fun makePatties() {
        println("warming buns")
    }

    open fun deliver() {}

    fun prepareBurger() {
        makePatties()
        grillMeat()
        addToppings()
        deliver()
    }
}

class ChickenBurger : Burger() {
    override fun grillMeat() {
        println("Grill chicken")
    }

    override fun addToppings() {
        println("Add things needed for chicken burger")
    }

    override fun deliver() {
        println("Deliver chicken burger")
    }
}

class HamBurger : Burger() {
    override fun grillMeat() {
        println("Grill chicken")
    }

    override fun addToppings() {
        println("Add things needed for ham burger")
    }
}
Enter fullscreen mode Exit fullscreen mode

The code above implements a hook method called deliver. Burgers that are deliver-ably would simply override that method.

The template pattern is used a lot when it comes to creating frameworks, where the framework controls how things get done, but leaves you to specify some details.

The template pattern is prevalent in Android app development. An example of the template pattern is subclassing Fragments, Activities, anything that has to do with the Android SDK. Whenever you override any event method e.g onCreate(), you are essential hooking into the Android SDK.

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay