Design Patterns in Action Script-Template Method
Do you like playing cards? If your had ever played, you may noticed that everyone has their own way arranging the cards. And in most cases, people will put the cards in order, maybe from the biggest one to the smallest one. Eh, this is a way of sorting.
We can write down the following code to mimic this action.
- public function sort ( array : Array ) : void
- {
- for ( var i : int = 0 ; i < array . length ; i ++ )
- {
- for ( var j : int = 0 ; j < array . length - i ; j ++ )
- if ( ( int )( array [ j ]) < ( int )( array [ j + 1 ]) )
- swap ( array , j , j + 1 ) ;
- }
- }
Here, I use the bubble sort, not insertion sort. Because I think the bubble sort is easy to understand. Using this sort will make you cards arrange from the biggest to the smallest, and the sequence is from left to right. Eh, maybe you don’t like to this sequence, you’d like to hold the cards from the smallest to the biggest, and also it’s from left to right.
Of course, you can change the code with your sorting logic. But, you’ll find that you just need to change the compare logic. Maybe, we can extract the compare logic to another function. And the code will be as follows.
- for ( var i : int = 0 ; i < array . length ; i ++ )
- {
- for ( var j : int = 0 ; j < array . length - i ; j ++ )
- if ( compare ( array , j , j + 1 ) )
- swap ( array , j , j + 1 ) ;
- }
Now, we can rewrite the compare function to get a different result. Let’s go further, we don’t need to implement the compare method now, we can delay it to the subclass. Then, each subclass can get its own way of sorting by override the compare function.
And the class diagram will be.
Aha, a new pattern! And it’s called template method.
The intent is here.
Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
– By THE GOF BOOK
As you see the skeleton of our sorting algorithm is defined in the template class, and the compare function is use for the subclass to redefine.
This pattern is very useful especially when your high level design is stable, but the detail needs to change frequency.