คำถามติดแท็ก observer-pattern

1
ความแตกต่างระหว่าง Consumer / Producer และ Observer / Observable
ฉันกำลังทำงานเกี่ยวกับการออกแบบแอปพลิเคชันที่ประกอบด้วยสามส่วน: เธรดเดียวที่เฝ้าดูเหตุการณ์บางอย่างที่เกิดขึ้น (การสร้างไฟล์คำขอภายนอก ฯลฯ ) เธรดผู้ปฏิบัติงาน N ที่ตอบสนองต่อเหตุการณ์เหล่านี้โดยการประมวลผล (ผู้ปฏิบัติงานแต่ละกระบวนการและใช้เหตุการณ์เดียวและการประมวลผลอาจใช้เวลาแปรผัน) คอนโทรลเลอร์ที่จัดการเธรดเหล่านั้นและจัดการข้อผิดพลาด (การรีสตาร์ทเธรดการบันทึกผลลัพธ์) แม้ว่านี่จะค่อนข้างพื้นฐานและไม่ยากที่จะนำมาใช้ แต่ฉันก็สงสัยว่ามันจะเป็นวิธีที่ "ถูกต้อง" (ในกรณีที่เป็นรูปธรรมนี้ใน Java แต่คำตอบที่เป็นนามธรรมก็สูงขึ้นเช่นกัน) กลยุทธ์ทั้งสองมาถึงใจ: ผู้สังเกตการณ์ / สังเกตได้:ผู้สังเกตการณ์จะเฝ้าสังเกตด้ายดู ในกรณีที่มีเหตุการณ์เกิดขึ้นคอนโทรลเลอร์จะได้รับแจ้งและสามารถมอบหมายงานใหม่ให้กับเธรดอิสระจากกลุ่มเธรดแคชที่ใช้ซ้ำได้ (หรือรอและแคชงานในคิว FIFO หากเธรดทั้งหมดไม่ว่างในขณะนี้) เธรดผู้ปฏิบัติงานใช้ Callable และส่งคืนผลลัพธ์ที่สำเร็จพร้อมกับผลลัพธ์ (หรือค่าบูลีน) หรือส่งคืนพร้อมข้อผิดพลาดในกรณีนี้ผู้ควบคุมอาจตัดสินใจว่าจะทำอย่างไร (ขึ้นอยู่กับลักษณะของข้อผิดพลาดที่เกิดขึ้น) ผู้ผลิต / ผู้บริโภค : เธรดการเฝ้าดูที่ใช้ร่วมกัน BlockingQueue กับตัวควบคุม (เหตุการณ์คิว) และตัวควบคุมที่ใช้ร่วมกันสองกับคนงานทั้งหมด (งานคิวและผลคิว) ในกรณีที่เกิดเหตุการณ์ด้ายเฝ้าดูทำให้วัตถุงานในคิวเหตุการณ์ คอนโทรลเลอร์ใช้งานใหม่จาก event-queue ตรวจสอบและวางไว้ใน task-queue ผู้ปฏิบัติงานแต่ละคนรองานใหม่และรับ / ใช้งานจากคิวงาน (มาก่อนได้รับก่อนจัดการโดยคิวเอง) …

4
รูปแบบการออกแบบใดที่เหมาะสมกว่าสำหรับการบันทึก
ฉันควรบันทึกเหตุการณ์บางอย่างในโปรแกรม แต่เท่าที่ฉันรู้จะเป็นการดีกว่าถ้าจะเก็บรหัสการบันทึกภายนอกโปรแกรมเพราะมันไม่เกี่ยวกับการใช้งานจริงของโปรแกรม ดังนั้นคุณช่วยบอกฉันได้ไหมว่าฉันควรเก็บรหัสนี้เอาไว้อย่างสมบูรณ์และใช้ผู้สังเกตการณ์และผู้ฟังเพื่อบันทึกเหตุการณ์เท่านั้นหรือไม่ หรือฉันสามารถเพิ่มบรรทัดของรหัสเช่นต่อไปนี้ทุกที่ที่ฉันต้องการบันทึกบางสิ่งบางอย่าง: MyGloriousLogger.getXXXLogger().Log(LogPlace, new LogObject(z1, z2, z3, z4, ..., z99)); ฉันทำผิดพลาดในการใช้รูปแบบการออกแบบของ Observer หรือไม่ ฉันต้องการรูปแบบการออกแบบอื่นหรือไม่ หรือฉันควรหยุดคิดเกี่ยวกับรูปแบบการออกแบบ? PS1 หากฉันต้องการเข้าสู่ระบบโดยใช้ผู้ฟังและผู้สังเกตการณ์เท่านั้นฉันจะต้องเพิ่มและปรับปรุงผู้สังเกตการณ์และผู้ฟังของโปรแกรมอย่างแน่นอน PS2 แน่นอนฉันรู้ว่ามีห้องสมุดที่แตกต่างกันสำหรับการเข้าสู่ระบบใน Java และฉันใช้ java.utils.logging แต่ฉันต้องมี wrapper เพื่อเข้าสู่ระบบวัตถุพิเศษของฉัน

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

2
รูปแบบของผู้สังเกตการณ์มีความเหมาะสมหรือไม่เมื่อผู้สังเกตการณ์ไม่เป็นอิสระต่อกัน?
ฉันมีclass Carซึ่งมี 2 คุณสมบัติ: และint price boolean inStockนอกจากนี้ยังถือเป็นListของabstract class State(ชั้นว่าง) มี 2 รัฐซึ่งสามารถนำมาใช้ในรถและแต่ละคนจะแสดงโดยระดับของตัวเอง: และclass Upgrade extends Stateclass Shipping extends State A Carสามารถเก็บหมายเลขใด ๆ ของแต่ละสถานะ 2 รัฐมีกฎต่อไปนี้: Upgrade: เพิ่ม1ราคาสำหรับแต่ละรัฐที่ใช้กับรถยนต์หลังจากนั้น Shippingถ้ามีอย่างน้อย 1 Shippingของรัฐในรายการแล้วมีการตั้งค่าinStockfalse ตัวอย่างเช่นเริ่มต้นด้วยprice = 1และinStock = true: add Shipping s1 --> price: 1, inStock: false add Upgrade g1 --> price: 1, …

4
IObserver <T> ของ. NET มีไว้สำหรับการสมัครสมาชิกกับ IObservables หลายรายการหรือไม่
มีอินเทอร์เฟซIObservableและIObserverใน. NET ( ที่นี่และที่นี่ด้วย ) ที่น่าสนใจคือการใช้งาน IObserver อย่างเป็นรูปธรรมไม่ได้ถือการอ้างอิงโดยตรงกับ IObservable ไม่รู้ว่าใครเป็นสมาชิก มันสามารถเรียก unsubscriber เท่านั้น "โปรดดึงหมุดเพื่อยกเลิกการสมัคร" แก้ไข:ดำเนิน unsubscriber IDisposableผมคิดว่าโครงการนี้ถูกจ้างมาเพื่อป้องกันไม่ให้ปัญหาผ่านพ้นไปฟัง แม้ว่าสองสิ่งนั้นยังไม่ชัดเจนนักสำหรับฉัน ชั้น Unsubscriber ภายในให้พฤติกรรมการสมัครและลืม? ใคร (และเมื่อใด) โทรIDisposable.Dispose()ไปที่ Unsubscriber? ตัวรวบรวมขยะ (GC) ไม่ได้กำหนดไว้ล่วงหน้า [ข้อจำกัดความรับผิดชอบ: โดยรวมฉันใช้เวลากับ C และ C ++ มากกว่า C # แล้ว] จะเกิดอะไรขึ้นถ้าฉันต้องการสมัครเป็นผู้สังเกตการณ์ K กับ L1 ที่สังเกตได้และผู้สังเกตการณ์ได้สมัครสมาชิก L2 ที่สังเกตได้อื่นแล้ว K.Subscribe(L1); K.Subscribe(L2); K.Unsubscribe(); L1.PublishObservation(1003); L2.PublishObservation(1004); …

5
ข้อดีของรูปแบบของผู้รับมอบสิทธิ์เหนือรูปแบบของผู้สังเกตการณ์คืออะไร
ในรูปแบบของผู้รับมอบสิทธิ์มีเพียงวัตถุเดียวเท่านั้นที่สามารถรับฟังเหตุการณ์ของวัตถุอื่นได้โดยตรง ในรูปแบบของผู้สังเกตการณ์วัตถุจำนวนหนึ่งสามารถฟังเหตุการณ์ของวัตถุนั้น ๆ ได้ เมื่อออกแบบคลาสที่ต้องการแจ้งวัตถุอื่นของเหตุการณ์เหตุใดคุณจึงต้องใช้รูปแบบผู้มอบหมายเหนือรูปแบบผู้สังเกตการณ์ ฉันเห็นรูปแบบผู้สังเกตการณ์มีความยืดหยุ่นมากขึ้น ตอนนี้คุณอาจมีผู้สังเกตการณ์เพียงคนเดียว แต่การออกแบบในอนาคตอาจต้องการผู้สังเกตการณ์หลายคน

2
รูปแบบการสังเกตการณ์ผ่าน HTTP และ TCP / IP (เซิร์ฟเวอร์ - ไคลเอ็นต์)
ฉันมีเซิร์ฟเวอร์และไคลเอนต์จำนวนมาก (ประมาณ 50 ไคลเอนต์) ที่เชื่อมต่อกับเซิร์ฟเวอร์นั้นขึ้นอยู่กับแอปพลิเคชันเว็บซึ่งแน่นอนว่าใช้โปรโตคอล HTTP ซึ่งใช้ TCP / IP ในทางกลับกัน (แก้ไขฉันหากฉันผิดเพราะฉัน เครือข่ายไม่เก่งจริงๆ) ปัญหาคือว่าฉันควรพัฒนากลไกการแจ้งเตือนซึ่งเมื่อใครบางคนส่งแบบฟอร์มที่มีค่าอันตรายผู้จัดการ (ผู้ที่เชื่อมต่อผ่านเว็บแอปพลิเคชันเดียวกัน) ควรได้รับป๊อปอัปแจ้งเตือนบนหน้าจอของเขาเกือบจะเป็นจริง - เวลา (ทันที) อย่างไรก็ตามเนื่องจากโปรโตคอล HTTP นั้นไร้สัญชาติฉันจึงสับสนเล็กน้อยที่นี่ ฉันไม่รู้ว่าฉันจะใช้สิ่งนี้ได้อย่างไร หนึ่งในวิธีแก้ปัญหาคือการใช้ JavaScript ข้างsetInterval()ฟังก์ชั่นเพื่อดึงข้อมูลในแต่ละวินาทีจากเซิร์ฟเวอร์ แต่ดูเหมือนว่าสกปรกเล็กน้อยสำหรับฉันและไม่เป็นมืออาชีพ พวกคุณมีความคิดที่จะนำโซลูชันอื่นมาใช้หรือไม่?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.