Pola Strategy
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 49 dari 65.
Pola Strategy menempatkan setiap versi algoritma dalam object tersendiri, sehingga kamu dapat mengganti algoritma saat program berjalan. Object yang menggunakannya, yaitu konteks, memanggil satu method dan tidak perlu tahu versi mana yang dimilikinya.
Berikut dua strategi serangan, sebuah parent class dan subclass dengan method yang sama, damage():
# attack_style.gd
class_name AttackStyle
extends RefCounted
func damage(power: int) -> int:
return power# heavy_attack.gd
class_name HeavyAttack
extends AttackStyle
func damage(power: int) -> int:
return power * 2Context menyimpan strategi dan menyerahkan perhitungan kepadanya:
# fighter.gd
class_name Fighter
extends RefCounted
var power := 10
var style: AttackStyle = AttackStyle.new()
func set_style(new_style: AttackStyle) -> void:
style = new_style
func attack() -> void:
print("Hit for ", style.damage(power))# main.gd
var fighter := Fighter.new()
fighter.attack()
fighter.set_style(HeavyAttack.new())
fighter.attack()Hit for 10
Hit for 20Fighter tidak pernah memeriksa gaya yang dimilikinya. Gaya baru berarti class baru, dan fighter.gd tetap seperti semula; rangkaian if style == "heavy" di dalam attack() akan bertambah panjang setiap kali ada gaya baru.
Jika sebuah strategi hanya berupa satu fungsi kecil tanpa datanya sendiri, Callable sudah cukup. Context menyimpan fungsi tersebut dan menjalankannya dengan call():
# price_calculator.gd
class_name PriceCalculator
extends RefCounted
var discount: Callable = func(price): return price
func final_price(price: int) -> int:
return discount.call(price)# main.gd
var calc := PriceCalculator.new()
print(calc.final_price(80))
calc.discount = func(price): return price / 2
print(calc.final_price(80))
calc.discount = func(price): return max(price - 25, 0)
print(calc.final_price(80))80
40
55Gunakan class saat sebuah strategi memiliki pengaturannya sendiri atau beberapa method, dan fungsi yang dapat dipanggil untuk satu perhitungan singkat. Kamu pernah menggunakan ide ini sebelumnya: fungsi perbandingan yang kamu berikan ke sort_custom() adalah strategi pengurutan.
Tantangan
SedangKeranjang belanja dapat mengganti strategi diskon saat checkout. Discount di discount.gd adalah strategi dasar: tanpa diskon. Buat dua strategi lagi dan keranjangnya:
PercentOff(dibuat dengan persentase):apply(total)mengembalikantotal - total * percent / 100(operasi bilangan bulat), danlabel()mengembalikan10% offuntuk diskon 10 persen.FixedOff(dibuat dengan jumlah tertentu):apply(total)mengembalikan total dikurangi jumlah tersebut, tetapi hasilnya tidak pernah kurang dari0, danlabel()mengembalikan30 offuntuk jumlah 30.Cart:set_discount(new_discount)menyimpan strategi, dancheckout()menjumlahkan harga lalu mengembalikanSubtotal TOTAL, LABEL, pay PRICE, dengan PRICE sebagai hasil yang dikembalikan olehapply()strategi tersebut.
Kode yang disediakan membaca harga dalam satu baris, jumlah checkout berikutnya, dan satu strategi per baris: percent N, fixed N atau none. Untuk harga 50 30 40 dan strategi percent 10, fixed 30, none, outputnya adalah:
Subtotal 120, 10% off, pay 108
Subtotal 120, 30 off, pay 90
Subtotal 120, no discount, pay 120Tulis kodemu di cart.gd, percent_off.gd, dan fixed_off.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 cart := Cart.new()
for price in OS.read_string_from_stdin().split(" "):
cart.add_item(int(price))
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "percent":
cart.set_discount(PercentOff.new(int(parts[1])))
elif parts[0] == "fixed":
cart.set_discount(FixedOff.new(int(parts[1])))
else:
cart.set_discount(Discount.new())
print(cart.checkout())
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