Pola Adapter
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 51 dari 65.
Pola Adapter memungkinkan sebuah object bekerja dengan kode yang mengharapkan method berbeda. Adapter membungkus object tersebut dan mengubah setiap pemanggilan yang diharapkan menjadi pemanggilan yang dimengerti oleh object tersebut.
Sebuah class lama dari proyek terdahulu menyimpan health sebagai dua angka:
# old_monster.gd
class_name OldMonster
extends RefCounted
var life := 30
var max_life := 120HUD-mu menampilkan apa pun yang memiliki get_label() dan get_hp_percent(). Knight sudah memiliki keduanya (mengembalikan "Knight" dan 80), tetapi OldMonster tidak memiliki keduanya:
# health_display.gd
class_name HealthDisplay
extends RefCounted
func show_health(target) -> void:
print(target.get_label(), ": ", target.get_hp_percent(), "%")Adapter menyimpan OldMonster dan menyediakan dua method yang dipanggil oleh tampilan:
# 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%Baik OldMonster maupun HealthDisplay tidak berubah. Hal itu penting saat kamu tidak bisa atau sebaiknya tidak mengedit class: class tersebut berasal dari plugin, dimiliki tim lain, atau namanya digunakan oleh banyak skrip.
Adapter meneruskan setiap pemanggilan dan mengonversi data selama prosesnya, di sini dua angka menjadi satu persentase. Kalikan sebelum membagi: dengan bilangan bulat, 30 / 120 * 100 menghasilkan 0, sedangkan 30 * 100 / 120 menghasilkan 25.
Tantangan
MudahPapan cuaca menampilkan sensor yang memiliki get_sensor_name() dan get_celsius(), seperti ModernSensor (modern_sensor.gd). Papan tersebut berada di weather_board.gd. Termometer lama (legacy_thermometer.gd) hanya menyediakan read_fahrenheit() dan get_code(). Tulis adapter ThermometerAdapter:
- Konstruktor menyimpan
LegacyThermometeryang dibungkus. get_sensor_name()mengembalikanThermometer, sebuah spasi, dan kode termometer tersebut, sepertiThermometer TH-4.get_celsius()mengembalikan suhu dalam Celsius:(fahrenheit - 32) * 5 / 9, sebagaifloat.
Jangan ubah class lainnya. Kode yang disediakan membaca jumlah sensor berikutnya, lalu satu sensor per baris: legacy ID FAHRENHEIT atau modern NAME CELSIUS. Kode tersebut membungkus setiap termometer lama dengan adapter-mu dan menampilkan semua sensor. Untuk legacy 4 98.6 dan modern Garden 21.5, outputnya adalah:
Thermometer TH-4: 37.0 C
Garden: 21.5 C
Warmest: Thermometer TH-4Tuliskan kodemu di thermometer_adapter.gd. main.gd berisi kode input/output yang disediakan dan tidak dapat diedit.
Coba sendiri
extends Node
func _ready():
# Kode input/output yang disediakan: biarkan apa adanya
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()
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass dan objectKata Kunci selfmethodpropertyKonstruktor (_init)Ringkasan: Kalkulator Sederhana4Polimorfisme
Method Overriding Sekali LagiDuck TypingKelas Abstrak dan MethodDesain InterfaceRingkasan: Kalkulator Bentuk7Sinyal
Apa itu Sinyal?Mendeklarasikan dan MemancarkanMenghubungkan ke SinyalSinyal dengan ArgumenRangkuman, Sistem Kesehatan10Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola Composite2Property class
Variabel instance vs. variabel statisFungsi statisSetter propertyGetter propertyPrivat berdasarkan konvensiRangkuman: Pengelola Rekening Bank5Enkapsulasi
Member Publik dan PrivatValidasi dengan SetterPenyembunyian InformasiProperty Hanya-BacaRingkasan: Sistem Catatan Siswa8Konsep OOP Lanjutan
Komposisi vs PewarisanInner ClassNode sebagai KomponenRefCounted vs NodeEnum dalam Class11Proyek: Manajemen Perpustakaan
Gambaran Umum Proyekclass Buku dan PenggunaLatihan sendiri: Compiler GDScript online