Adaptör Kalıbı
Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 51 / 65.
Adaptör deseni, bir nesnenin farklı yöntemler bekleyen kodlarla çalışmasını sağlar. Adaptör, nesneyi sarar ve beklenen her çağrıyı nesnenin anlayacağı bir çağrıya dönüştürür.
Önceki bir projeden kalan eski bir sınıf, sağlığı iki sayı olarak saklıyor:
# old_monster.gd
class_name OldMonster
extends RefCounted
var life := 30
var max_life := 120HUD'unuz, get_label() ve get_hp_percent() metodlarına sahip olan her şeyi gösterir. Knight zaten ikisine de sahiptir (sırasıyla "Knight" ve 80 döndürür), ancak OldMonster bunların hiçbirine sahip değildir:
# health_display.gd
class_name HealthDisplay
extends RefCounted
func show_health(target) -> void:
print(target.get_label(), ": ", target.get_hp_percent(), "%")Bağdaştırıcı bir OldMonster tutar ve ekranın çağırdığı iki yöntemi sağlar:
# 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%Ne OldMonster ne de HealthDisplay değişti. Bir sınıfı düzenleyemediğinizde veya düzenlememeniz gerektiğinde bu önemlidir: sınıf bir eklentiden gelir, başka bir ekip ona sahiptir ya da birçok betik sınıfın adlarına bağımlıdır.
Adaptör her çağrıyı iletir ve verileri aktarırken dönüştürür; burada iki sayıyı tek bir yüzdeye dönüştürür. Bölmeden önce çarpın: tam sayılarla 30 / 120 * 100 sonucu 0 olurken, 30 * 100 / 120 sonucu 25 olur.
Görev
KolayBir hava durumu panosu, ModernSensor (modern_sensor.gd) gibi get_sensor_name() ve get_celsius() yöntemlerine sahip sensörleri gösterir. Pano weather_board.gd dosyasındadır. Eski termometreler (legacy_thermometer.gd) yalnızca read_fahrenheit() ve get_code() yöntemlerini sunar. ThermometerAdapter adaptörünü yaz:
- Yapıcı, sarmalanan
LegacyThermometernesnesini saklar. get_sensor_name(),Thermometer, bir boşluk ve termometrenin kodunu (örneğinThermometer TH-4) döndürür.get_celsius(), Celsius cinsinden sıcaklığı(fahrenheit - 32) * 5 / 9formülüyle birfloatolarak döndürür.
Diğer sınıfları değiştirme. Sağlanan kod, önce devamındaki sensörlerin sayısını, ardından her satırda bir sensör olacak şekilde legacy ID FAHRENHEIT veya modern NAME CELSIUS değerlerini okur. Tüm eski termometreleri adaptörünle sarar ve tüm sensörleri gösterir. legacy 4 98.6 ve modern Garden 21.5 için çıktı şöyledir:
Thermometer TH-4: 37.0 C
Garden: 21.5 C
Warmest: Thermometer TH-4Kodunu thermometer_adapter.gd dosyasına yaz. main.gd, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
extends Node
func _ready():
# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
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()
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Nesne Yönelimli Programlamanın Temelleri
Harici DosyalarNesne Yönelimli Programlamaya GirişSınıflar ve Nesnelerself Anahtar KelimesiMetotlarÖzelliklerKurucu (_init)Tekrar - Basit Hesap Makinesi4Çok Biçimlilik
Metot Ezme Konusuna Yeniden BakışÖrdek TiplemesiSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı7Sinyaller
Sinyal Nedir?Tanımlama ve Sinyal GöndermeSinyallere BağlanmaArgümanlı SinyallerTekrar - Sağlık Sistemi10Tasarım Kalıpları 2. Bölüm
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik Kalıp2Sınıf Özellikleri
Örnek ve Statik DeğişkenlerStatik FonksiyonlarÖzellik AyarlayıcılarıÖzellik AlıcılarıGeleneksel Olarak ÖzelTekrar - Banka Hesabı Yöneticisi5Kapsülleme
Public ve Private ÜyelerSetter'larla DoğrulamaBilgi GizlemeSalt Okunur ÖzelliklerTekrar - Öğrenci Kayıt SistemiKendi başına pratik yap: Online GDScript derleyicisi