ข้อดีของรูปแบบของผู้รับมอบสิทธิ์เหนือรูปแบบของผู้สังเกตการณ์คืออะไร


9

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


4
คุณหมายถึงอะไรโดย "รูปแบบตัวแทน" หากคุณกำลังพูดถึงตัวแทนของ. net คุณสามารถมีสมาชิกได้มากเท่าที่คุณต้องการ
CodesInChaos

มีความเกี่ยวข้อง แต่มุ่งเน้นไปที่ Cocoa: NSNotificationCenter มากกว่าการมอบหมาย (ใช้โปรโตคอล) หรือไม่
mouviciel

คำตอบ:


7

ไม่มีรูปแบบการมอบหมายต่อ se ฉันจะถือว่าคุณหมายถึงรูปแบบคณะผู้แทน

เมื่อฉันเข้าใจแล้วมันกลับกันและใช้เพื่อจุดประสงค์ที่แตกต่างกัน

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

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


6

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


1
ผู้ร่วมประชุมไม่มีอะไรมากไปกว่าผู้สังเกตการณ์ของเหตุการณ์ ผู้รับมอบสิทธิ์ไม่จำเป็นต้อง "จัดการ" สิ่งใด มันสามารถทำอะไรได้อย่างปลอดภัยและจะไม่ส่งผลกระทบต่ออินสแตนซ์ที่ทำให้เกิดเหตุการณ์
Marjan Venema

5
@MarjanVenema - หากวัตถุ A ไม่ได้มอบหมายความรับผิดชอบสำหรับกิจกรรมไปยังวัตถุ B คุณไม่ได้ใช้รูปแบบการมอบหมาย: คุณกำลังใช้รูปแบบการสังเกตการณ์กับผู้สังเกตการณ์เพียงคนเดียว
Telastyn

ใช่นั่นคือสิ่งที่ฉันคิด ฉันเข้าใจว่าผู้ได้รับมอบหมายให้เป็นประเภทลายเซ็นของเหตุการณ์ที่สมาชิกของเหตุการณ์ "OnWhething" ใช้ เห็นได้ชัดว่าผู้ได้รับมอบหมายใน C # ไม่ใช่ผู้สมัครสมาชิกเดียวเนื่องจากพวกเขาอยู่ในตัวอย่าง Delphi
Marjan Venema

@Marjan Venema "ผู้เข้าร่วมจริง ๆ ไม่มีอะไรมากไปกว่าผู้สังเกตการณ์ของเหตุการณ์" - มันขึ้นอยู่กับภาษาที่คุณพูดถึง ใน Objective C ผู้ร่วมประชุมบางคนมีหน้าที่รับผิดชอบในการให้ข้อมูล - เช่นผู้แทนข้อมูล - และวัตถุที่ขาดหายไปผู้แทนข้อมูลไม่มีข้อมูลที่จะนำเสนอ ในกรณีเหล่านั้นมีการมอบหมายเกิดขึ้นซึ่งแตกต่างจากการกระทำเพียงสังเกตอะไรบางอย่าง
occulus

1
@occulus: ขอบคุณสำหรับการชี้แจง น่าเสียดายที่ภาษาไม่สามารถเห็นด้วยกับคำศัพท์ได้ ... การพูดคุยเกี่ยวกับการเขียนโปรแกรมด้วยวิธีไม่เชื่อเรื่องภาษาจะยากขึ้นเล็กน้อยเมื่อผู้คนเข้าใจสิ่งต่าง ๆ สำหรับคำเดียวกัน
Marjan Venema

4

นั่นเป็นคำถามของการแลกเปลี่ยนหลายครั้ง

ไม่ชอบการค้า:

  • ความยืดหยุ่น (ในแง่ของการมี n> 1 คน / ผู้สังเกตการณ์)
  • ค่าใช้จ่ายในการส่งข้อความ
  • ความยืดหยุ่น (ความสามารถในการรักษาความพร้อมใช้งานของผู้รับมอบสิทธิ์ / ผู้สังเกตการณ์ไม่เพียงพอ)
  • สะดวกในการใช้

รูปแบบตัวแทน:

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

รูปแบบสังเกตการณ์:

  • มีความยืดหยุ่นสูง - คาดว่าจะเพิ่มผู้สังเกตการณ์ n> 1 คนด้วยการออกแบบ
  • การส่งข้อความมีค่าใช้จ่ายโดยนัยโดยจำนวนผู้สังเกตการณ์ O (n) เช่นผู้สังเกตการณ์ใช้เวลา n และข้อความ (อย่างน้อยก็ในการปฏิบัติที่ไร้เดียงสา)
  • มักจะมีความยืดหยุ่น - ผู้สังเกตการณ์มักไม่คาดหวังว่าจะทำงานใด ๆ ในส่วนของผู้ส่ง นั่นคือแม้ว่าจะไม่มีผู้สังเกตการณ์ผู้ส่งจะไม่ได้รับผลกระทบ
  • สามารถเข้าใจได้ค่อนข้างซับซ้อนโดยเฉพาะผู้สังเกตการณ์ที่คาดว่าจะตอบสนองต่อข้อความ (ลำดับนั้นสำคัญหรือไม่ผู้สังเกตการณ์คนไหนตอบสนองในทางใด?)

1

รูปแบบของผู้ได้รับมอบหมายอย่างที่ฉันเข้าใจคุณก็รู้ว่าเป็นกลไกจัดการเหตุการณ์ในภาษาอื่นเช่น Delphi มันเป็นเพียงการนำไปปฏิบัติของรูปแบบผู้สังเกตการณ์ซึ่งมีข้อ จำกัด ที่สำคัญคือมีเพียงผู้ฟังครั้งละหนึ่งคนเท่านั้น

ข้อเสียของตัวจัดการเหตุการณ์หรือผู้รับมอบอำนาจชัดเจน: ผู้สังเกตการณ์เพียงคนเดียวเท่านั้น

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


ฮะ? ผู้รับมอบสิทธิ์ C # เป็นเพียงลายเซ็นต์ของวิธีการที่เป็นประเภทตัวแปร (เทียบเท่ากับตัวอย่างเช่นint (*my_int_f)(int)ใน C) ฉันคิดเสมอว่าพวกเขาจะทำให้เข้าใจง่ายขึ้นโดยทำให้มันทำงานได้เหมือน struct / enum เหตุการณ์เป็นตะขอสำหรับอาร์เรย์ที่มีความยืดหยุ่นของผู้ฟังโดยใช้ลายเซ็นของผู้ร่วมประชุมคนเดียว คุณสามารถทำได้โดยไม่มีเหตุการณ์ (ซึ่งเป็นเหตุผลที่ฉันถือว่า OP หมายถึงรูปแบบการมอบหมายซึ่งแตกต่างกันมาก) แต่ภาษาทำให้มันง่ายขึ้นสำหรับคุณ
pdr

อืมม ยังไม่เข้าใจใน C # ฉันเข้าใจผู้ได้รับมอบหมายให้เทียบเท่าประเภทลายเซ็นเหตุการณ์ที่ใช้โดยเหตุการณ์ "OnWhething" ในตัวอย่างเช่น Delphi ดังนั้นเหตุการณ์ C # สามารถสมัครรับข้อมูลโดยผู้ฟังหลายคนได้หรือไม่
Marjan Venema

การกระทำทั่วไป <T> เป็นตัวแทน มันไม่เกี่ยวอะไรกับเหตุการณ์มันเป็นตัวแปรที่ผ่านไปมา และใช่ผู้ฟังหลายคนสามารถฟังเหตุการณ์เดียว
pdr

โอเคขอบคุณหวังว่าฉันจะสามารถทำให้มันตรง ... :-) เอาการอ้างอิง C # และมุ่งเน้นไปที่กลไกเหตุการณ์
Marjan Venema

1

นี่คือโพสต์เก่า แต่ฉันจะพูดสอดในต่อไปเพราะคำตอบอื่น ๆ ไม่ได้จัดการกับสิ่งที่เกิดขึ้นเมื่อใช้ทั้งสองรูปแบบพวกเขาดูเหมือนจะเกี่ยวกับทฤษฎีมากกว่าการปฏิบัติ

การมอบหมายและผู้สังเกตการณ์ทำงานอย่างไร

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

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

ข้อดีของการมอบหมาย

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

ข้อเสียของคณะผู้แทน

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

เมื่อจะเลือกผู้แทน?

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

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.