views:

116

answers:

3

Can anyone let me know some example situations where Template Method - pattern should be used?

Give me some real-world use from your own experience.

(I have so far found it useful only for mapping data in the DA layer. Sorry!!!)

+1  A: 

A Template method pattern provides a skeleton for performing any sort of algorithm or an operation, and it allows the sub-classes to re-define part of the logic.

Pros: Natural fit for building frameworks, so that parent framework classes can make callbacks into methods implemented in child.

Examples:

  • java.util.AbstractList
  • Servlet's doGet and doPost methods
  • MDB's onMessage method
  • Struts Action class
  • Spring's data access classes

Cons: Restricts you to a single inheritance in Java.

Pascal Thivent
I just had a look at the AbstractList and HttpServlet classes. I don't see any "template methods" in them. I suspect you are confusing the Template Method pattern with simple "inversion of control" uses. The pattern is not about having a base class whose methods are called by a framework, but about having a method which encapsulates a algorithm which can be customized by subclasses that override special extension points (overridable methods of the base class called from the template method, which itself is not meant to be overridden).
Rogerio
@Rogerio The fact that *you* don't see the pattern doesn't mean that `HttpServlet` and `AbstractList` are not good examples. With `HttpServelt`, subclasses **do** implement `doGet`, `doPost`, etc which are the extensions points called in `service` (which is the only method called by the container for each request as per spec). With `AbstractList`, subclasses **do** implement `get`, `size`, `set`, `remove` (just look at the javadoc header) which are the extension points. I don't see any IoC for the mentioned extension points.
Pascal Thivent
@Rogerio So, instead of teaching me what Ioc and the the template pattern are, maybe learn to recognize them first (use Google if you think I'm wrong before to claim *your* truth). Also maybe learn how servlet work. But don't blame me for *your* ignorance. Consequently, I do not thank you for your irrelevant downvote that I ask you to reconsider.
Pascal Thivent
Yes, the HttpServlet#service method is very much like a Template Method, except that is not meant to be called from application code, but only from the web container; so it could be taken as an example, though not a very good one. Now, doGet and doPost certainly aren't examples of Template Methods at all; rather, they are examples of the "primitive operations" called from the template method. This is all described in the GoF book, of course (pages 325-330).
Rogerio
In the case of AbstractList, the "get" method (abstract in this class) is only called from non-public inner classes, and "size" (with a trivial implementation which is never overriden, at least in other JDK classes) is not called at all from inside AbstractList.So, they definitely are not Template Methods, nor "primitive operations" called from some Template Method. There is no way to deny this, it's a fact any Java programmer can verify for himself.
Rogerio
Inversion of control (also known as the "Hollywood principle" - see http://en.wikipedia.org/wiki/Inversion_of_control) is used in the Servlet API and in the Struts framework, where the client programmer implements methods which are called by the framework (the web container, in the case of Servlets), as opposed to calling framework methods from client code (which is the regular case where you simply use a class library, without the inversion which characterizes a "framework"). I suspect you may be confusing it with "dependency inversion", which is a whole different matter.
Rogerio
You say "subclasses do implement get, size, set, remove": true, since AbstractList is only a partial implementation - except for the `size` method which is fully implemented in AbstractList itself. Clearly, you must understand that a Template Method is implemented in the base class and not overriden in a subclass; only the "primitive operations" called from the template method are implemented in the subclass. For example, the `AbstractList#get(int)` method is abstract and therefore could only be a "primitive operation" (which you agree, right?). But there is no template method in this class.
Rogerio
@Rogerio Ok, wrong examples, the right one is `addAll(int index, Collection<? extends E> c)`. Regarding `HttpServlet`, I still think this is a valid example too. But I won't argue more with you. If you have another point of view, just write your own answer.
Pascal Thivent
You're right, `addAll` qualifies as a Template Method, which relies on a subclass implementing the `add(int, E)` "primitive operation" method. Maybe not so good an example because it only uses one primitive operation, but it's valid.
Rogerio
@Rogerio I'd prefer to forget all this (including the comments). I got carried away and said something I didn't mean yesterday. I guess I was in a bad day and apologize for that.
Pascal Thivent
That's ok, Pascal. I did realize at the time that it was just an over-reaction.
Rogerio
+1  A: 

I have used the template method for Business Logic where a number of components shared the same process but the implementation was slightly different.

Burt
+1  A: 

An application of the Template Method pattern has two main characteristics:

  1. There is a base class (in Java, one only with protected constructors and optionally declared as abstract) which will be subclassed in client code.
  2. There are two groups of methods defined in the base class: a) one or more template methods (typically only one) and one or more primitive operation methods (typically more than one). Each template method represents a high level operation, implemented in the base class itself in terms of the primitive operations, which are meant to be implemented/overriden in each specific subclass. Normally, the template method is public and non-overridable (final, in Java); its API documentation must specify precisely which primitive operation methods it calls, and when (that is, it must describe the "algorithm"). A primitive operation method, which represents a step in the algorithm, should be non-public but overridable (protected, in Java), and can be of two types: a) an abstract method which must be implemented in the subclass; b) a method with a default/empty implementation which may be overriden in the subclass.

One good example in the Java 6 SDK is the execute() method of the javax.swing.SwingWorker class (it is a public final void method). In this case, the primitive operation methods are doInBackground(), process(List), and done(). The first one is abstract and therefore requires an implementation in the subclass; it's called by the template method in a background thread. The other two have empty implementations and can optionally be overriden in the subclass; they are called during and at the end of processing, respectively, in the EDT (the Swing Event Dispatch Thread), to allow updates to the UI.

In my own experience, I have sometimes used this pattern. One such case was a Java base class implementing the java.util.Iterator interface, where next() was the template method and there was only one primitive operation method responsible for instantiating a specific domain entity class (this was meant to be used when iterating over a list of persistent domain entity objects, using JDBC). A better example in that same application was a base class where the template method implemented a multi-step algorithm intended to populate a "business entity maintenance screen" (using Swing) from a given list of persistent entities; primitive operations methods were called to 1) clear the current screen state, and 2) add an entity in a table view inside the screen; optionally, other primitive operations were called from the template method if the screen was editable.

In the end, I must say that although this certainly is a useful design pattern, not so often a situation comes up where it really is applicable. Simply having a base class with methods that get overriden in a subclass (a much more common situation, in my experience) is not enough, by itself, to qualify as an application of the pattern.

Rogerio