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 := 120Twó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.
Wyzwanie
ŁatwyTablica 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()zwracaThermometer, spację i kod termometru, na przykładThermometer TH-4.get_celsius()zwraca temperaturę w stopniach Celsjusza:(fahrenheit - 32) * 5 / 9, jako wartość typufloat.
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-4Twó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()
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe selfMetodyWłaściwościKonstruktor (_init)Powtórka – prosty kalkulator4Polimorfizm
Ponowne omówienie przesłaniania metodDuck typingKlasy i metody abstrakcyjneProjektowanie interfejsówPowtórzenie – kalkulator kształtów7Sygnały
Czym jest sygnał?Deklarowanie i emitowanieŁączenie z sygnałamiSygnały z argumentamiPodsumowanie — system zdrowia10Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu2Właściwości klas
Zmienne instancji a zmienne statyczneFunkcje statyczneSettery właściwościGettery właściwościPrywatne z konwencjiPodsumowanie — menedżer kont bankowych5Enkapsulacja
Elementy publiczne i prywatneWalidacja za pomocą setterówUkrywanie informacjiWłaściwości tylko do odczytuPodsumowanie – system ewidencji uczniów8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieKlasy wewnętrzneWęzły jako komponentyRefCounted a NodeTypy wyliczeniowe w klasach11Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superNadpisywanie metodŁańcuchy dziedziczeniaSprawdzanie typów za pomocą isPodsumowanie – hierarchia pracowników6Metody specjalne
Wprowadzenie do metod wirtualnychMetoda _to_stringWłasne iteratoryPodsumowanie — własna lista9Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator GDScript online