Sì, lo schema modello è un po 'più di un semplice override di un metodo nella classe base.
Il modello di modello può essere utilizzato quando viene definito concretamente un profilo di un algoritmo, tuttavia i passaggi dell'algoritmo vengono lasciati astratti. Ciò significa che i passaggi possono essere implementati in diversi modi. Ma non ci si aspetta che lo schema generale dell'algoritmo cambi.
Un esempio che ho appena creato al volo:
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();
In sostanza, il modo in cui un giorno si prevede di correre giù è concretamente definite nella classe Vita. Tuttavia, i dettagli del processo sono curati dalla sottoclasse (ad esempio GoodLife). La classe GoodLife implementerà passaggi molto diversi rispetto a una possibile classe di ToughLife.
Ci sono alcune variazioni a questo modello; per esempio alcuni dei passaggi possono anche essere definiti concretamente. Nell'esempio, il eatLunch() può essere definito concretamente nella classe Life; il che significa che le sottoclassi non dovrebbero cambiare questo comportamento.
Il modello ha molto senso se si dispone di un algoritmo relativamente complesso che potrebbe essere implementato in modi diversi.
======================================
io in qualche modo ho perso la parte con Objective-C nella mia risposta. Ecco come dovrebbe apparire in 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 non dispone di un supporto incorporato per le classi astratte, così ho lavorato intorno ad esso utilizzando il metodo doesNotRecognizeSelector:
. Ulteriori dettagli sulle classi astratte & L'obiettivo-C può essere trovato here.
Se si sente parlare di uno schema di progettazione e si pensa "Non c'è molto da fare", hai quasi ragione. Molti di loro sono ovvi. – morningstar