Menu
CoddyTech

Patrón Template Method

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 53 de 65.

El patrón Método de plantilla fija el orden de los pasos de un algoritmo en una clase padre y permite que cada subclase complete algunos de los pasos. El método padre que ejecuta los pasos es el método de plantilla.

# 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() es la plantilla: cada nivel se carga, genera a sus enemigos y se completa, en este orden. Los pasos que varían son abstractos, así que cada subclase tiene que escribirlos:

# forest_level.gd
class_name ForestLevel
extends Level

func get_level_name() -> String:
	return "Forest"

func spawn_enemies() -> void:
	print("3 wolves appear")

CaveLevel se escribe de la misma manera, con el nombre "Cave" y 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!

Un paso también puede tener un valor predeterminado en la clase principal que una subclase puede sobrescribir. A un paso opcional de este tipo se le llama gancho:

# 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

Solo los niveles que sobrescriben has_boss() para que devuelva true obtienen la línea del jefe. Las subclases escriben los pasos y la clase padre decide cuándo se ejecutan, así que una subclase deja play() intacto y todos los niveles siguen el mismo orden.

challenge icon

Desafío

Intermedio

Un juego exporta sus puntuaciones en dos formatos siguiendo los mismos pasos. Las filas son Diccionarios con un "name" y un "score".

  • En exporter.gd, escribe el método plantilla export_rows(rows): imprime header(), después format_row(row) para cada fila y, luego, footer(rows). No se imprime un encabezado o pie de página que sea una cadena vacía. Los métodos header() y footer() devuelven "" de forma predeterminada, y format_row() es abstracto.
  • CsvExporter: el encabezado es name,score y una fila es Ada,12. Sin pie de página.
  • ListExporter: sin encabezado, una fila es * Ada scored 12 y el pie de página es Players: N con el número de filas.

El código proporcionado lee el formato (csv o list), cuántas filas siguen y, luego, una fila NAME SCORE por línea. Para list con Ada 12 y Bo 7, la salida es:

* Ada scored 12
* Bo scored 7
Players: 2

Tu código va en exporter.gd, csv_exporter.gd y list_exporter.gd. main.gd contiene el código de entrada/salida proporcionado y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: mantenlo tal como está
	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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online