Pola Decorator
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 52 dari 65.
Pola Decorator menambahkan perilaku ke sebuah object dengan membungkusnya dalam object lain yang memiliki method yang sama. Setiap pembungkus memanggil object di dalamnya dan menambahkan bagiannya sendiri, dan pembungkus dapat ditumpuk dalam urutan apa pun.
# weapon.gd
class_name Weapon
extends RefCounted
func get_damage() -> int:
return 10
func describe() -> String:
return "Sword"Dekorator memperluas Weapon, jadi dekorator dapat digunakan di mana pun sebuah senjata diharapkan, dan menyimpan senjata yang dibungkusnya:
# fire_enchant.gd
class_name FireEnchant
extends Weapon
var inner: Weapon
func _init(wrapped: Weapon) -> void:
inner = wrapped
func get_damage() -> int:
return inner.get_damage() + 5
func describe() -> String:
return inner.describe() + " + Fire"SharpEnchant ditulis dengan cara yang sama, tetapi get_damage()-nya mengembalikan inner.get_damage() * 2 dan describe()-nya menambahkan " + Sharp".
# main.gd
var weapon: Weapon = Weapon.new()
print(weapon.describe(), ": ", weapon.get_damage())
weapon = FireEnchant.new(weapon)
weapon = SharpEnchant.new(weapon)
print(weapon.describe(), ": ", weapon.get_damage())Sword: 10
Sword + Fire + Sharp: 30Pemanggilan bergerak ke dalam: SharpEnchant meminta FireEnchant, yang meminta pedang. Pedang mengembalikan 10, api mengubahnya menjadi 15, dan sharp menggandakannya menjadi 30. Dengan urutan sebaliknya, FireEnchant.new(SharpEnchant.new(Weapon.new())), damage-nya adalah 10 * 2 + 5, yaitu 25.
Tanpa decorator, setiap kombinasi akan membutuhkan subclass tersendiri: FireSword, SharpSword, FireSharpSword, dan seterusnya. Dengan decorator, dua class kecil mencakup setiap kombinasi, dan enchantment baru hanya membutuhkan satu file tambahan.
Tantangan
SedangSebuah kedai kopi membuat minuman dengan decorator. Beverage (beverage.gd) mendeklarasikan cost() dan description(); Espresso (espresso.gd, $3) dan Tea (tea.gd, $2) sudah ditulis. Setiap decorator menyimpan minuman yang dibungkusnya di inner (constructor-nya sudah ditulis). Override cost() dan description() di:
Milk: biayanya bertambah1dan menambahkan+ Milkke deskripsi.Mocha: biayanya bertambah2dan menambahkan+ Mocha.Large: menggandakan biaya semua yang ada di dalamnya dan menambahkanLargedi depan deskripsi.
Kode yang disediakan membaca jumlah pesanan, lalu satu pesanan per baris: minumannya (espresso atau tea) dan tambahannya, yang diterapkan dari kiri ke kanan. Untuk espresso milk large dan tea mocha milk, output-nya adalah:
Large Espresso + Milk: $8
Tea + Mocha + Milk: $5Tulis kodemu di milk.gd, mocha.gd, dan large.gd. main.gd berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
extends Node
func _ready():
# Kode input/output yang disediakan: biarkan apa adanya
var count := int(OS.read_string_from_stdin())
for i in count:
var words := OS.read_string_from_stdin().split(" ")
var drink: Beverage = Tea.new()
if words[0] == "espresso":
drink = Espresso.new()
for extra in words.slice(1):
match extra:
"milk":
drink = Milk.new(drink)
"mocha":
drink = Mocha.new(drink)
"large":
drink = Large.new(drink)
print("%s: $%d" % [drink.description(), drink.cost()])
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