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() -> voidplay() 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 falseSolo 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.
Desafío
IntermedioUn 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 plantillaexport_rows(rows): imprimeheader(), despuésformat_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étodosheader()yfooter()devuelven""de forma predeterminada, yformat_row()es abstracto. CsvExporter: el encabezado esname,scorey una fila esAda,12. Sin pie de página.ListExporter: sin encabezado, una fila es* Ada scored 12y el pie de página esPlayers: Ncon 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: 2Tu 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)
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
1Fundamentos de la programación orientada a objetos
Archivos externosIntroducción a la programación orientada a objetosClases vs. objetosLa palabra clave selfMétodosPropiedadesConstructor (_init)Repaso: calculadora sencilla4Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas7Señales
¿Qué es una señal?Declarar y emitirConectarse a las señalesSeñales con argumentosRepaso: sistema de salud10Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite2Propiedades de clase
Variables de instancia y estáticasFunciones estáticasMétodos setter de propiedadesMétodos getter de propiedadesPrivado por convenciónRepaso: administrador de cuentas bancarias5Encapsulación
Miembros públicos y privadosValidación con settersOcultación de informaciónPropiedades de solo lecturaRepaso: sistema de registros de estudiantes8Conceptos avanzados de POO
Composición frente a herenciaClases internasNodos como componentesRefCounted frente a NodeEnums en clases3Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosCadenas de herenciaComprobaciones de tipo con isRepaso: jerarquía de empleados6Métodos especiales
Introducción a los métodos virtualesEl método _to_stringIteradores personalizadosRepaso: lista personalizada9Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de GDScript online