160 likes | 416 Views
Template method. How to make a pizza. If you order a pizza, the manufacturing of a pizza goes through certain steps We can write up a sort of algorithm for making a pizza. How to make a pizza. // From a class Pizza MakePizza() { CreateDough(); RolloutDough();
E N D
How to make a pizza • If you order a pizza, the manufacturing of a pizza goes through certain steps • We can write up a sort of algorithm for making a pizza PBA WEB – BEWP
How to make a pizza // From a class Pizza MakePizza() { CreateDough(); RolloutDough(); if (MustAddTomatoSauce()) AddTomatoSauce(); AddToppings(); if (MustAddCheese()) AddCheese(); Bake(); Cut(); PutInBox(); } PBA WEB – BEWP
How to make a pizza • This method for creating a pizza is generic; we always follow this algorithm • However, not all of the individual steps are generic; they vary with the actual product • We can categorise the methods, according to their ”level of generic-ness” PBA WEB – BEWP
How to make a pizza Is a fully generic method for making a pizza MakePizza() { CreateDough(); RolloutDough(); if (MustAddTomatoSauce()) AddTomatoSauce(); AddToppings(); if (MustAddCheese()) AddCheese(); Bake(); Cut(); PutInBox(); } PBA WEB – BEWP
How to make a pizza MakePizza() { CreateDough(); RolloutDough(); if (MustAddTomatoSauce()) AddTomatoSauce(); AddToppings(); if (MustAddCheese()) AddCheese(); Bake(); Cut(); PutInBox(); } The red steps are fully generic – they never vary PBA WEB – BEWP
How to make a pizza MakePizza() { CreateDough(); RolloutDough(); if (MustAddTomatoSauce()) AddTomatoSauce(); AddToppings(); if (MustAddCheese()) AddCheese(); Bake(); Cut(); PutInBox(); } The green steps may vary, but have a default behavior PBA WEB – BEWP
How to make a pizza MakePizza() { CreateDough(); RolloutDough(); if (MustAddTomatoSauce()) AddTomatoSauce(); AddToppings(); if (MustAddCheese()) AddCheese(); Bake(); Cut(); PutInBox(); } The brown step will vary, and has no default behavior PBA WEB – BEWP
Method categorisation PBA WEB – BEWP
Specialised pizza • How can we then make a specific pizza? • We can let a subclass – e.g HawaiiPizza-NoCheese specialise the Pizza class • What should this class implement..? • Non-generic steps, i.e • Hooks • Primitive Operations PBA WEB – BEWP
Specialised pizza public class HawaiiPizzaNoCheese : Pizza { // Hook (overrides default behavior) publicoverridebool MustAddCheese() { returnfalse;} publicoverridevoid AddToppings() // Primitive operation { AddPineAppleSlices(); AddShrimps(); AddShreddedHam(); } } PBA WEB – BEWP
Template method pattern AbstractClass TemplateMethod() … PrimitiveOpA() PrimitiveOpB() PrimitiveOpC() Notice this is not an interface! ConcreteClass PrimitiveOpA() PrimitiveOpB() PrimitiveOpC() TemplateMethod() is never overwritten! PBA WEB – BEWP
Template method pattern Pizza myPizza = new CopenhagenSpecialPizza(); ... myPizza.MakePizza(); // Notice that Pizza myPizza = new Pizza() // will fail! PBA WEB – BEWP
Template method pattern • What have we achieved? • Program to an interface, not an implementation • Clients will only know the AbstractClass interface • Encapsulate the aspects that vary • Specialised algorithm steps are located in the specialised classes PBA WEB – BEWP
Template method pattern • What have we achieved? • Open for extension, closed for modification • We can add new specialisations without modification of base • Don’t call us, we’ll call you • Base class calls specialised steps, not vice versa • The last principle is called the Hollywood Agent principle PBA WEB – BEWP
Base Base MakePizza CreateDough() AddToppings() Spec. MakePizza Spec. Template method pattern Don’t call us, we’ll call you - High-level classes are in control - Low-level classes can be hooked onto a system - Low-level classes don’t call high-level classes directly PBA WEB – BEWP