Berpikir tentang permainan biasa, tidak masalah jenis permainannya, sangat mungkin kita membutuhkan beberapa jenis kamera. Sebagai contoh:
- Kamera debug: dikendalikan oleh keyboard dan mouse, dengan itu kami dapat bergerak di mana saja di tempat kami.
- Kamera skrip: dengan itu kita dapat menginstruksikan kamera untuk bergerak, mengikuti jalur yang ditentukan.
- Kamera pemain.
- ...
Masing-masing jenis kamera ini memiliki fungsi pembaruan sendiri. Sistem termudah (dan buruk), adalah memiliki kelas manajer kamera dengan fungsi pembaruan generik dan fungsi pembaruan khusus untuk setiap jenis kamera. Di dalam fungsi pembaruan umum kami memiliki pernyataan sakelar yang, berdasarkan pada jenis kamera, memanggil fungsi pembaruan yang tepat.
Alih-alih ini saya sudah memikirkan pendekatan lain: pola strategi. Kami memindahkan setiap perilaku kamera (metode pembaruan) dalam kelas yang sesuai yang mengimplementasikan antarmuka umum. Di manajer kamera kami memiliki anggota untuk antarmuka itu, dan kami dapat mengatur secara dinamis setiap perilaku yang kita inginkan.
Apa pendapatmu tentang itu? Sistem apa lagi yang Anda sarankan untuk saya? Terima kasih.
Info tambahan: ada kemungkinan nyata bahwa saya memerlukan lebih dari satu kamera aktif, misalnya untuk refleksi. Singkatnya, saya harus memperhitungkannya juga.
sumber
Jawaban:
Pola strategi sepertinya taruhan yang bagus untuk saya. Untuk mengambil langkah lebih jauh, manajer kamera Anda harus tetap tidak tahu jenis kamera konkret. Anda akan mendaftar dan mengubah implementasi kamera secara eksternal oleh id (saya menggunakan string untuk fleksibilitas tetapi bisa juga enum atau int), misalnya (tanpa pengecekan kesalahan):
Edit
Itu sepele untuk ditambahkan. Ubah saja
currentCamera
ke:Ubah
SetCamera
ke ToggleCamera (atau tambahkan boolean ke SetCamera, pilihan Anda):Dan ubah
Update
metode untuk memperbarui semua kamera yang aktif, bukan hanya yang saat ini:Dalam contoh saya, Anda juga harus mengganti
View
properti denganGetView
metode yang menggunakan id kamera sebagai parameter. Tapi itu detail yang tergantung pada antarmuka kamera Anda:sumber