ฉันได้สร้างคลาสนามธรรมสองวิชาและผู้สังเกตการณ์ที่กำหนดอินเทอร์เฟซรูปแบบการสังเกตคลาสสิก ฉันสืบทอดมาจากพวกเขาเพื่อใช้รูปแบบการสังเกตการณ์ ผู้สังเกตการณ์อาจมีลักษณะเช่นนี้:
void MyClass::Update(Subject *subject)
{
if(subject == myService_)
{
DoSomething();
}
else if(subject == myOtherService_)
{
DoSomethingElse();
}
}
นี่เป็นเรื่องปกติและบอกฉันว่าใครเปลี่ยนอะไร อย่างไรก็ตามมันไม่ได้บอกฉันว่ามีอะไรเปลี่ยนแปลง บางครั้งสิ่งนี้ก็โอเคเพราะฉันแค่จะสืบค้นเรื่องสำหรับข้อมูลล่าสุด แต่บางครั้งฉันก็ต้องรู้ว่าสิ่งที่เปลี่ยนแปลงไปในเรื่องนั้น ๆ ฉันสังเกตเห็นใน Java พวกเขามีทั้ง informObservers () วิธีการและalertObservers (Object ARG)วิธีการสันนิษฐานว่าจะระบุรายละเอียดเกี่ยวกับสิ่งที่เปลี่ยนแปลง
ในกรณีของฉันฉันจำเป็นต้องรู้ว่าหนึ่งในสองของการกระทำที่แตกต่างกันเกิดขึ้นในเรื่องและถ้าเป็นการกระทำที่เฉพาะเจาะจงเพื่อทราบจำนวนเต็มที่เกี่ยวข้องกับการกระทำนั้น
ดังนั้นคำถามของฉันคือ:
- วิธี C ++ ผ่านอาร์กิวเมนต์ทั่วไป (เช่น Java)
- ผู้สังเกตการณ์เป็นแบบแผนที่ดีที่สุดหรือไม่? บางทีระบบเหตุการณ์บางอย่าง?
UPDATE
ผมพบว่าบทความนี้ซึ่งพูดเกี่ยวกับรูปแบบ templating สังเกตการณ์: การนำเรื่องรูปแบบกับแม่แบบ / นักสังเกตการณ์ นี่ทำให้ฉันสงสัยว่าคุณสามารถโต้เถียงเรื่องแม่แบบได้หรือไม่
ผมพบว่าคำถามนี้กองล้นที่พูดเกี่ยวกับ templating อาร์กิวเมนต์: แม่แบบตามรูปแบบเรื่องสังเกตการณ์ - ฉันควรใช้ static_cast หรือ dynamic_cast อย่างไรก็ตาม OP ดูเหมือนว่าจะมีปัญหาที่ไม่มีใครตอบ
สิ่งอื่น ๆ ที่ฉันสามารถทำได้คือเปลี่ยนวิธีการอัปเดตเป็นวัตถุ EventArg เช่นเดียวกับใน:
void MyClass::Update(Subject *subject, EventArg arg)
{
...
จากนั้นสร้างคลาสย่อยของ EventArg สำหรับข้อมูลอาร์กิวเมนต์ที่เฉพาะเจาะจงแล้วฉันเดาว่ามันจะส่งกลับไปที่คลาสย่อยเฉพาะภายในวิธีการอัปเดต
อัพเดท 2
พบบทความเกี่ยวกับการสร้างเฟรมเวิร์ก c ++ แบบอะซิงโครนัสข้อความ ส่วนที่ 2ซึ่งกล่าวถึงการให้หัวเรื่องสื่อสารรายละเอียดเกี่ยวกับสิ่งที่เปลี่ยนแปลง
ตอนนี้ผมกำลังพิจารณาอย่างจริงจังโดยใช้Boost.Signals การใช้รูปแบบผู้สังเกตการณ์ของฉันเองนั้นสมเหตุสมผลเมื่อมันเรียบง่าย แต่การทำให้เท็มเพลตและการโต้แย้งเริ่มซับซ้อนขึ้น และฉันอาจต้องการความปลอดภัยของเธรดของ Boost.Signals2
อัพเดท 3
ฉันยังพบบทความที่น่าสนใจเกี่ยวกับรูปแบบการสังเกตการณ์:
การสังเกตผู้สังเกตการณ์โดย Herb Sutter
การนำรูปแบบการสังเกตไปใช้ใน C ++ - ตอนที่ 1
ประสบการณ์การใช้รูปแบบการออกแบบของผู้สังเกตการณ์ (ตอนที่ 2)
ประสบการณ์การใช้รูปแบบการออกแบบของผู้สังเกตการณ์ (ตอนที่ 3)
อย่างไรก็ตามฉันได้เปลี่ยนการใช้งานของฉันไปใช้ Boost.Signals ซึ่งในขณะที่อาจปูดป่องสำหรับวัตถุประสงค์ของฉันทำงานได้สำเร็จ และอาจมีความกังวลเกี่ยวกับการขยายตัวหรือความเร็วที่ไม่เกี่ยวข้อง