Patron Méthode modèle
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 53 sur 65.
Le modèle Template Method fixe l’ordre des étapes d’un algorithme dans une classe parente et permet à chaque sous-classe de compléter certaines étapes. La méthode parente qui exécute les étapes est la méthode template.
# level.gd
@abstract
class_name Level
extends RefCounted
func play() -> void:
print("Loading ", get_level_name())
spawn_enemies()
print("Level complete!")
@abstract func get_level_name() -> String
@abstract func spawn_enemies() -> voidplay() est le modèle : chaque niveau se charge, fait apparaître ses ennemis et se termine, dans cet ordre. Les étapes qui diffèrent sont abstraites, donc chaque sous-classe doit les écrire :
# forest_level.gd
class_name ForestLevel
extends Level
func get_level_name() -> String:
return "Forest"
func spawn_enemies() -> void:
print("3 wolves appear")CaveLevel s’écrit de la même manière, avec le nom "Cave" et 5 bats appear.
# main.gd
var levels: Array[Level] = [ForestLevel.new(), CaveLevel.new()]
for level in levels:
level.play()Loading Forest
3 wolves appear
Level complete!
Loading Cave
5 bats appear
Level complete!Une étape peut également avoir une valeur par défaut dans la classe parent, que la sous-classe peut remplacer. Une telle étape facultative est appelée un hook :
# level.gd
func play() -> void:
print("Loading ", get_level_name())
spawn_enemies()
if has_boss():
print("The boss arrives")
print("Level complete!")
func has_boss() -> bool:
return falseSeul un niveau qui redéfinit has_boss() pour renvoyer true obtient la ligne du boss. Les sous-classes écrivent les étapes et la classe parente décide quand elles s’exécutent, donc une sous-classe ne modifie pas play() et tous les niveaux suivent le même ordre.
Défi
MoyenUn jeu exporte ses scores dans deux formats en suivant les mêmes étapes. Les lignes sont des dictionnaires avec un "name" et un "score".
- Dans
exporter.gd, écris la méthode templateexport_rows(rows): elle afficheheader(), puisformat_row(row)pour chaque ligne, puisfooter(rows). Un en-tête ou un pied de page qui est une chaîne vide n'est pas affiché. Les hooksheader()etfooter()renvoient""par défaut, etformat_row()est abstraite. CsvExporter: l'en-tête estname,score, et une ligne estAda,12. Pas de pied de page.ListExporter: pas d'en-tête, une ligne est* Ada scored 12, et le pied de page estPlayers: N, où N est le nombre de lignes.
Le code fourni lit le format (csv ou list), le nombre de lignes qui suivent, puis une ligne NAME SCORE par ligne. Pour list avec Ada 12 et Bo 7, la sortie est :
* Ada scored 12
* Bo scored 7
Players: 2Ton code va dans exporter.gd, csv_exporter.gd et list_exporter.gd. main.gd contient le code d'entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
extends Node
func _ready():
# Code d'entrée/sortie fourni : conservez-le tel quel
var style := OS.read_string_from_stdin()
var rows: Array = []
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
rows.append({"name": parts[0], "score": int(parts[1])})
var exporter: Exporter = CsvExporter.new()
if style == "list":
exporter = ListExporter.new()
exporter.export_rows(rows)
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé selfMéthodesPropriétésConstructeur (_init)Récapitulatif - Calculatrice simple4Polymorphisme
Retour sur la redéfinition des méthodesTypage canardClasses et méthodes abstraitesConception d’interfacesRécapitulatif – Calculateur de formes7Signaux
Qu’est-ce qu’un signal ?Déclarer et émettreSe connecter aux signauxSignaux avec argumentsRécapitulatif - système de santé10Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron Composite2Propriétés de classe
Variables d’instance et variables statiquesFonctions statiquesSetters de propriétésGetters de propriétésPrivé par conventionRécapitulatif - Gestionnaire de comptes bancaires5Encapsulation
Membres publics et privésValidation avec les méthodes setterMasquage de l’informationPropriétés en lecture seuleRécapitulatif - Système de dossiers étudiants8Concepts avancés de la POO
Composition ou héritageClasses internesLes nœuds comme composantsRefCounted ou NodeEnums dans les classes3Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodesChaînes d’héritageVérifier les types avec isRécapitulatif – Hiérarchie des employés6Méthodes spéciales
Introduction aux méthodes virtuellesLa méthode _to_stringItérateurs personnalisésRécapitulatif – Liste personnalisée9Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur GDScript en ligne