Menu
CoddyTech

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 := 120

HUD'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.

challenge icon

Görev

Kolay

Bir 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 LegacyThermometer nesnesini saklar.
  • get_sensor_name(), Thermometer, bir boşluk ve termometrenin kodunu (örneğin Thermometer TH-4) döndürür.
  • get_celsius(), Celsius cinsinden sıcaklığı (fahrenheit - 32) * 5 / 9 formülüyle bir float olarak 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-4

Kodunu 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()
quiz iconKendini test et

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

Kendi başına pratik yap: Online GDScript derleyicisi