Sí, el patrón de la plantilla es un poco más que simplemente anular un método en la clase base.
El patrón de plantilla se puede usar cuando se define concretamente un contorno de un algoritmo, sin embargo, los pasos del algoritmo se dejan abstractos. Eso significa que los pasos se pueden implementar de diferentes maneras. Pero no se espera que el esquema general del algoritmo cambie.
Un ejemplo que acabo creado sobre la marcha:
class Life {
public method goThroughTheDay(){
goToWork();
eatLunch();
comeBackHome();
programABitMore();
}
abstract method goToWork();
abstract method eatLunch();
abstract method comeBackHome();
abstract method programABitMore();
}
class GoodLife extends Life {
//override all the abstract methods here
}
//The client application
Life life = new GoodLife();
life.goThroughTheDay();
Básicamente, la forma en que se espera un día para correr hacia abajo se define concretamente en el ramo de Vida. Sin embargo, los detalles del proceso son atendidos por la subclase (es decir, GoodLife). La clase de GoodLife implementará los pasos de manera muy diferente a una posible clase de ToughLife.
Existen algunas variaciones de este patrón; por ejemplo, algunos de los pasos también se pueden definir de manera concreta. En el ejemplo, eatLunch() se puede definir concretamente en la clase Life; lo que significa que no se espera que las subclases cambien este comportamiento.
El patrón tiene mucho sentido si tiene un algoritmo relativamente complejo que podría implementarse de diferentes maneras.
======================================
de alguna manera se perdió la parte con Objective-C en mi respuesta. Aquí es cómo se vería en Objective-C:
@interface Life : NSObject
- (void) goThroughTheDay;
- (void) goToWork; // Abstract
- (void) eatLunch; // Abstract
- (void) comeBackHome; // Abstract
- (void) programABitMore; // Abstract
@end
@implementation Life
- (void) goThroughTheDay {
[self goToWork];
[self eatLunch];
[self comeBackHome];
[self programABitMore];
}
- (void) goToWork { [self doesNotRecognizeSelector:_cmd]; }
- (void) eatLunch { [self doesNotRecognizeSelector:_cmd]; }
- (void) comeBackHome { [self doesNotRecognizeSelector:_cmd]; }
- (void) programABitMore { [self doesNotRecognizeSelector:_cmd]; }
@end
@interface GoodLife : Life
@end
@implementation GoodLife
- (void) goToWork { NSLog(@"Good Work"); }
- (void) eatLunch { NSLog(@"Good Lunch"); }
- (void) comeBackHome { NSLog(@"Good Comeback"); }
- (void) programABitMore { NSLog(@"Good Programming"); }
@end
Objective-C no se han incorporado en el apoyo a las clases abstractas, así que trabajó alrededor de ella usando el método doesNotRecognizeSelector:
. Se pueden encontrar muchos más detalles sobre las clases abstractas & Objective-C here.
Si escuchas sobre un patrón de diseño y piensas: "No hay mucho para eso", tienes más razón. Muchos de ellos son obvios. – morningstar