Saya telah membuat dua kelas abstrak Subject dan Observer yang mendefinisikan antarmuka pola Observer klasik. Saya berasal dari mereka untuk menerapkan pola Observer. Seorang pengamat mungkin terlihat seperti ini:
void MyClass::Update(Subject *subject)
{
if(subject == myService_)
{
DoSomething();
}
else if(subject == myOtherService_)
{
DoSomethingElse();
}
}
Ini baik dan itu memberitahu saya siapa yang mengubah sesuatu. Namun, itu tidak memberi tahu saya apa yang berubah. Terkadang ini ok karena saya hanya akan meminta Subjek untuk data terbaru, tetapi di lain waktu saya perlu tahu apa yang sebenarnya berubah pada Subjek. Saya perhatikan di Jawa mereka memiliki metode notifyObservers () dan metode notifyObservers (Object arg) untuk menentukan rincian tentang apa yang berubah.
Dalam kasus saya, saya perlu tahu apakah salah satu dari beberapa tindakan berbeda terjadi pada subjek dan, jika itu tindakan tertentu, untuk mengetahui bilangan bulat yang terkait dengan tindakan itu.
Jadi pertanyaan saya adalah:
- apa cara C ++ untuk melewatkan argumen umum (seperti yang dilakukan Java)?
- Apakah Pengamat bahkan merupakan pola terbaik? Mungkin semacam sistem acara?
MEMPERBARUI
Saya menemukan artikel ini yang berbicara tentang templating pola Observer: Menerapkan pola Subjek / Observer dengan templat . Ini membuat saya bertanya-tanya apakah Anda bisa membuat templat argumen.
Saya menemukan pertanyaan overflow tumpukan ini yang berbicara tentang templating argumen: Pola Pengamat Subjek berbasis template - Haruskah saya menggunakan static_cast atau dynamic_cast . Namun, OP tampaknya memiliki masalah yang belum ada yang menjawab.
Hal lain yang bisa saya lakukan adalah mengubah metode Pembaruan untuk mengambil objek EventArg seperti pada:
void MyClass::Update(Subject *subject, EventArg arg)
{
...
Dan kemudian membuat subclass dari EventArg untuk data argumen tertentu, dan kemudian saya kira melemparkannya kembali ke subclass spesifik dalam metode pembaruan.
PEMBARUAN 2
Juga menemukan artikel, Saat membuat kerangka kerja c ++ berbasis pesan yang tidak sinkron; bagian 2 yang membahas perihal Subjek mengkomunikasikan perincian tentang apa yang berubah.
Saya sekarang serius mempertimbangkan untuk menggunakan Boost.Signals . Menggunakan pola pengamat saya sendiri masuk akal ketika itu sederhana, tetapi templating jenis dan argumen mulai menjadi rumit. Dan saya mungkin membutuhkan keamanan thread dari Boost.Signals2.
PEMBARUAN 3
Saya juga menemukan beberapa artikel menarik tentang pola pengamat:
Generalisasi Pengamat oleh Herb Sutter
Menerapkan Pola Pengamat di C ++ - Bagian 1
Pengalaman Menerapkan Pola Desain Pengamat (Bagian 2)
Pengalaman Menerapkan Pola Desain Pengamat (Bagian 3)
Namun, saya telah beralih implementasi saya untuk menggunakan Boost.Signals yang, walaupun mungkin sedikit membengkak untuk tujuan saya, berhasil bekerja. Dan mungkin kekhawatiran tentang kembung atau kecepatan tidak relevan.