รูปแบบ Observer ใน Delphi จะขยายรูปแบบ Observer พื้นฐาน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโหมดผู้สังเกตการณ์ โปรดดูที่ [Gam+, หน้า 293..303]
กำหนดความสัมพันธ์แบบหนึ่งต่อกลุ่มระหว่างออบเจ็กต์ เมื่อสถานะของออบเจ็กต์เปลี่ยนแปลง ออบเจ็กต์ทั้งหมดที่ขึ้นอยู่กับออบเจ็กต์นั้นจะได้รับแจ้งและอัปเดตโดยอัตโนมัติ
การแยกระบบออกเป็นชุดของคลาสการทำงานร่วมกันมีผลข้างเคียงบางประการ: ความสอดคล้องระหว่างวัตถุที่เกี่ยวข้องจะต้องได้รับการปกป้อง เราไม่ต้องการจับคู่ประเภทให้แน่นเพื่อความสม่ำเสมอของมิติ เนื่องจากจะช่วยลดการนำกลับมาใช้ใหม่ได้ [เกม+,p293].
เหตุการณ์ของ Delphi (ที่อยู่วิธีการจริง) ช่วยให้คุณมีโครงสร้างที่ดีสำหรับการจัดการปัญหาเหล่านี้ เหตุการณ์ช่วยให้คุณสามารถกำจัดการเชื่อมต่อและบรรลุการเชื่อมต่อที่ดีขึ้น ตัวอย่างเช่น: เหตุการณ์ TButton.OnClick ถูกส่งไปเพื่อทำงานที่เกี่ยวข้องให้เสร็จสิ้น แต่คลาสไม่ได้บันทึกการอ้างอิงถึงตัวจัดการเหตุการณ์ ในรูปแบบผู้สังเกตการณ์ คลาสที่ส่งเหตุการณ์เรียกว่าวัตถุเป้าหมาย (หัวเรื่อง) และคลาสที่ควบคุมเหตุการณ์เรียกว่าผู้สังเกตการณ์ (ผู้สังเกตการณ์)
เหตุการณ์ใน Delphi สามารถกำจัดการเชื่อมต่อของคลาสได้ดีขึ้น หากคุณต้องการควบคุมหลายเหตุการณ์และอ้างอิงถึงโหมดผู้สังเกตการณ์ คุณสามารถสร้างกลไกการแจ้งเตือนแบบหนึ่งต่อกลุ่มได้ เป้าหมายสามารถมีผู้สังเกตการณ์จำนวนเท่าใดก็ได้ ผู้สังเกตการณ์ทุกคนจะได้รับการแจ้งเตือนเมื่อสถานะของเป้าหมายเปลี่ยนแปลง หลังจากที่ผู้สังเกตการณ์ได้รับการแจ้งเตือน ผู้สังเกตการณ์จะสอบถามวัตถุเป้าหมายทันทีเพื่อรักษาการซิงโครไนซ์กับวัตถุเป้าหมาย
การโต้ตอบนี้เรียกอีกอย่างว่าเผยแพร่-สมัครสมาชิก และเป้าหมายคือผู้เผยแพร่การแจ้งเตือน ไม่จำเป็นต้องรู้ว่าใครเป็นผู้สังเกตการณ์เมื่อพบการแจ้งเตือน ผู้สังเกตการณ์จำนวนเท่าใดก็ได้สามารถสมัครและรับการแจ้งเตือนได้
แอปพลิเคชั่นโหมดผู้สังเกตการณ์นี้จะทำให้คุณได้รับประโยชน์จากกลไกเหตุการณ์ Delphi ในการจัดการการมีเพศสัมพันธ์ของคลาส โครงสร้างแบบหนึ่งต่อกลุ่มลงทะเบียนผู้สังเกตการณ์ผ่านการลงทะเบียนและยกเลิกการลงทะเบียน กลไกแบบหนึ่งต่อกลุ่มถูกนำไปใช้จริงบนพื้นฐานของตัววนซ้ำ
สมมติว่าคุณมีคลาส Tsubject ที่กำหนดพฤติกรรมที่มีความหมาย ก่อนอื่นเรามาดูโค้ดสาธิตของโหมดผู้สังเกตการณ์กันก่อน:
พิมพ์
TSubject = คลาส (TObject)
ส่วนตัว
ผู้สังเกตการณ์: TList;
สาธารณะ
ขั้นตอน RegisterObserver (ผู้สังเกตการณ์: TSubjectObserver);
ขั้นตอน UnregisterObserver (ผู้สังเกตการณ์: TSubjectObserver);
จบ;
TSubjectObserver = คลาส (TComponent)
ส่วนตัว
FEnabled: บูลีน;
ที่ตีพิมพ์
คุณสมบัติที่เปิดใช้งาน: บูลีนอ่าน FEnabled เขียน FEnabled ค่าเริ่มต้นจริง;
จบ;
ท่ามกลางอินเทอร์เฟซข้างต้น:
กลไกการลงทะเบียนสำหรับการลงทะเบียนผู้สังเกตการณ์สำหรับ Tsubject
¨ FObservers: TList; เก็บผู้สังเกตการณ์ที่ลงทะเบียนไว้
¨ RegisterObserver(..) ใช้เพื่อลงทะเบียนผู้สังเกตการณ์และเพิ่มลงใน Fobservers
¨ UnregisterObserver(..) ใช้เพื่อยกเลิกการลงทะเบียนผู้สังเกตการณ์และลบวัตถุที่เกี่ยวข้องออกจาก Fobservers
?โหมดผู้สังเกตการณ์ยังต้องสร้างคลาสใหม่ TsubjectObserver
¨ คลาสนี้เป็นทายาทของ Tcomponent
¨ คุณสมบัติที่เปิดใช้งานจะตั้งค่าการเปิดหรือปิดการสังเกต -
การใช้งานจริงของโหมดผู้สังเกตการณ์ต่อไปนี้:
ขั้นตอน TSubject.RegisterObserver (ผู้สังเกตการณ์: TSubjectObserver);
เริ่ม
ถ้า FObservers.IndexOf(Observer) = -1 แล้ว
FObservers.Add (ผู้สังเกตการณ์);
จบ;
ขั้นตอน TSubject.UnregisterObserver (ผู้สังเกตการณ์: TSubjectObserver);
เริ่ม
FObservers.Remove (ผู้สังเกตการณ์);
จบ;
การดำเนินการของซ่างกวนสนับสนุนส่วนการลงทะเบียนของผู้สังเกตการณ์ กลไกการแจ้งเตือนแบบหนึ่งต่อกลุ่มอยู่ที่ไหน สำหรับแอปพลิเคชันการแจ้งเตือนแบบหนึ่งต่อกลุ่มจริง คุณสามารถกำหนดวิธีการเปลี่ยนแปลงสำหรับ Tsubject เพื่อแจ้งเตือนผู้สังเกตการณ์ที่ลงทะเบียนไว้ และผู้สังเกตการณ์สามารถกำหนดแอตทริบิวต์เหตุการณ์ OnChange เพื่อจัดการการกำหนดเวลาได้ รหัสมีดังนี้:
พิมพ์
TSubject = คลาส (TObject)
ส่วนตัว
ผู้สังเกตการณ์: TList;
ได้รับการคุ้มครอง
» การเปลี่ยนแปลงขั้นตอน {เรียกวิธีนี้เพื่อส่งการแจ้งเตือน}
สาธารณะ
ขั้นตอน RegisterObserver (ผู้สังเกตการณ์: TSubjectObserver);
ขั้นตอน UnregisterObserver (ผู้สังเกตการณ์: TSubjectObserver);
จบ;
TSubjectObserver = คลาส (TComponent)
ส่วนตัว
FEnabled: บูลีน;
» FOnChange: TNotifyEvent;
ได้รับการคุ้มครอง
» การเปลี่ยนแปลงขั้นตอน;
ที่ตีพิมพ์
คุณสมบัติที่เปิดใช้งาน: บูลีนอ่าน FEnabled เขียน FEnabled;
» คุณสมบัติ OnChange: TNotifyEvent อ่าน FOnChange เขียน FOnChange;
จบ;
การดำเนินการ
ขั้นตอน TSubject.Change;
var
» Obs: TSubjectObserver;
» ฉัน: จำนวนเต็ม;
เริ่ม
» สำหรับฉัน := 0 ถึง FObservers.Count - 1 ทำ
" เริ่ม
» Obs := FObservers[I];
» ถ้า Obs.Enabled แล้ว Obs.Change;
" จบ;
จบ;
ขั้นตอน TSubject.RegisterObserver (ผู้สังเกตการณ์: TSubjectObserver);
เริ่ม
ถ้า FObservers.IndexOf(Observer) = -1 แล้ว
FObservers.Add (ผู้สังเกตการณ์);
จบ;
ขั้นตอน TSubject.UnregisterObserver (ผู้สังเกตการณ์: TSubjectObserver);
เริ่ม
FObservers.Remove (ผู้สังเกตการณ์);
จบ;
ขั้นตอน TSubjectObserver.Change;
เริ่ม
» ถ้าได้รับมอบหมาย (FOnChange) แล้ว FOnChange (ตนเอง);
จบ;
ในโค้ดการใช้งานด้านบน:
วิธีการเปลี่ยนของ Tsubject วนซ้ำกับผู้สังเกตการณ์ที่ลงทะเบียนทั้งหมดและเรียกวิธีการเปลี่ยนของผู้สังเกตการณ์แต่ละคน ซึ่งเป็นการนำการแจ้งเตือนแบบหนึ่งต่อกลุ่ม
คุณสมบัติ Enabled ของผู้สังเกตการณ์จะกำหนดว่าเป็นหรือรับการแจ้งเตือนหรือไม่
? เหตุการณ์ OnChange ของ TsubjectObserver จัดการการซิงโครไนซ์และการดำเนินการอื่น ๆ จริง ๆ
การจัดระเบียบ
// ข้อความที่ตัดตอนมาจาก "รูปแบบการออกแบบ" มากมาย