Menu
CoddyTech

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() -> void

play() 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 false

Seul 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.

challenge icon

Défi

Moyen

Un 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 template export_rows(rows) : elle affiche header(), puis format_row(row) pour chaque ligne, puis footer(rows). Un en-tête ou un pied de page qui est une chaîne vide n'est pas affiché. Les hooks header() et footer() renvoient "" par défaut, et format_row() est abstraite.
  • CsvExporter : l'en-tête est name,score, et une ligne est Ada,12. Pas de pied de page.
  • ListExporter : pas d'en-tête, une ligne est * Ada scored 12, et le pied de page est Players: 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: 2

Ton 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)
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur GDScript en ligne