Menu
CoddyTech

Wzorzec adaptera

Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 51 z 65.

Wzorzec Adapter pozwala obiektowi współpracować z kodem, który oczekuje innych metod. Adapter opakowuje obiekt i zamienia każde oczekiwane wywołanie na wywołanie zrozumiałe dla obiektu.

Stara klasa z wcześniejszego projektu przechowuje zdrowie jako dwie liczby:

# old_monster.gd
class_name OldMonster
extends RefCounted

var life := 30
var max_life := 120

Twój interfejs HUD wyświetla wszystko, co ma get_label() i get_hp_percent(). Knight ma już obie te metody (zwraca "Knight" i 80), ale OldMonster nie ma żadnej z nich:

# health_display.gd
class_name HealthDisplay
extends RefCounted

func show_health(target) -> void:
	print(target.get_label(), ": ", target.get_hp_percent(), "%")

Adapter przechowuje obiekt OldMonster i udostępnia dwie metody wywoływane przez wyświetlacz:

# monster_adapter.gd
class_name MonsterAdapter
extends RefCounted

var monster: OldMonster

func _init(wrapped: OldMonster) -> void:
	monster = wrapped

func get_label() -> String:
	return "Monster"

func get_hp_percent() -> int:
	return monster.life * 100 / monster.max_life
# main.gd
var display := HealthDisplay.new()
display.show_health(Knight.new())
display.show_health(MonsterAdapter.new(OldMonster.new()))
Knight: 80%
Monster: 25%

Nie zmieniono ani OldMonster, ani HealthDisplay. Ma to znaczenie, gdy nie możesz lub nie powinieneś edytować klasy: pochodzi ona z wtyczki, należy do innego zespołu albo wiele skryptów zależy od jej nazw.

Adapter przekazuje każde wywołanie i konwertuje dane po drodze — tutaj dwie liczby na jeden procent. Najpierw mnoż: w przypadku liczb całkowitych 30 / 120 * 100 daje 0, a 30 * 100 / 120 daje 25.

challenge icon

Wyzwanie

Łatwy

Tablica pogodowa wyświetla czujniki, które mają metody get_sensor_name() i get_celsius(), takie jak ModernSensor (modern_sensor.gd). Tablica znajduje się w pliku weather_board.gd. Stare termometry (legacy_thermometer.gd) udostępniają tylko metody read_fahrenheit() i get_code(). Napisz adapter ThermometerAdapter:

  • Konstruktor przechowuje opakowany obiekt LegacyThermometer.
  • get_sensor_name() zwraca Thermometer, spację i kod termometru, na przykład Thermometer TH-4.
  • get_celsius() zwraca temperaturę w stopniach Celsjusza: (fahrenheit - 32) * 5 / 9, jako wartość typu float.

Nie zmieniaj pozostałych klas. Dostarczony kod odczytuje liczbę czujników, które zostaną podane, a następnie dane każdego z nich w osobnym wierszu: legacy ID FAHRENHEIT lub modern NAME CELSIUS. Opakowuje każdy stary termometr w twój adapter i wyświetla wszystkie czujniki. Dla danych legacy 4 98.6 i modern Garden 21.5 wynik to:

Thermometer TH-4: 37.0 C
Garden: 21.5 C
Warmest: Thermometer TH-4

Twój kod umieść w pliku thermometer_adapter.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

extends Node

func _ready():
	# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
	var board := WeatherBoard.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		if parts[0] == "legacy":
			var old := LegacyThermometer.new(int(parts[1]), float(parts[2]))
			board.add_sensor(ThermometerAdapter.new(old))
		else:
			board.add_sensor(ModernSensor.new(parts[1], float(parts[2])))
	board.show_all()
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online