ยินดีต้อนรับสู่ความลาดชันลื่น คุณมาถึงจุดนี้แล้วด้วยความตระหนักว่าการโต้ตอบระหว่างกันของมุมมองโมเดลมีความผันแปรไม่สิ้นสุด MVC, MVP (Taligent, Dolphin, Passive View), MVVM เป็นเพียงชื่อไม่กี่
รูปแบบผู้นำเสนอมุมมองแบบเหมือนกับรูปแบบสถาปัตยกรรมส่วนใหญ่เปิดให้มีความหลากหลายและการทดลองมากมาย สิ่งหนึ่งที่การเปลี่ยนแปลงทั้งหมดมีเหมือนกันคือบทบาทของผู้นำเสนอในฐานะ "คนกลาง" ระหว่างมุมมองและโมเดล สองสิ่งที่พบได้บ่อยที่สุดคือมุมมองแบบพาสซีฟและตัวควบคุม / ผู้นำเสนอ - [ Fowler ] มุมมองแบบพาสซีฟถือว่า UI เป็นอินเทอร์เฟซแบบตื้นมากระหว่างผู้ใช้และผู้นำเสนอ มันมีน้อยมากถ้ามีเหตุผลใด ๆ มอบหมายความรับผิดชอบให้กับผู้นำเสนอ ผู้นำเสนอ / ผู้ควบคุมพยายามใช้ประโยชน์จากการเชื่อมโยงข้อมูลที่สร้างไว้ในเฟรมเวิร์ก UI จำนวนมาก UI จัดการการซิงโครไนซ์ข้อมูล แต่ขั้นตอนผู้นำเสนอ / ตัวควบคุมสำหรับตรรกะที่ซับซ้อนมากขึ้น ในทั้งสองกรณีโมเดลดูและผู้นำเสนอในรูปแบบสาม
มีหลายวิธีในการทำเช่นนี้ เป็นเรื่องธรรมดามากที่จะเห็นสิ่งนี้จัดการโดยการปฏิบัติแต่ละโต้ตอบ / แบบฟอร์มเป็นมุมมองที่แตกต่างกัน หลายครั้งที่มีความสัมพันธ์แบบ 1: 1 ระหว่างมุมมองและผู้นำเสนอ นี่ไม่ใช่กฎที่ยากและรวดเร็ว เป็นเรื่องปกติที่จะมีผู้นำเสนอคนเดียวจัดการหลายมุมมองที่เกี่ยวข้องหรือในทางกลับกัน ทุกอย่างขึ้นอยู่กับความซับซ้อนของมุมมองและความซับซ้อนของตรรกะทางธุรกิจ
สำหรับวิธีการนำเสนอมุมมองและได้รับการอ้างอิงไปยังแต่ละอื่น ๆ นี้บางครั้งเรียกว่าการเดินสายไฟ คุณมีสามทางเลือก:
มุมมองมีการอ้างอิงถึงผู้นำเสนอ
แบบฟอร์มหรือกล่องโต้ตอบใช้มุมมอง แบบฟอร์มมีตัวจัดการเหตุการณ์ที่ delgate ไปยังผู้นำเสนอโดยใช้การเรียกใช้ฟังก์ชันโดยตรง:
MyForm.SomeEvent(Sender)
{
Presenter.DoSomething(Sender.Data);
}
เนื่องจากผู้นำเสนอไม่มีการอ้างอิงไปยังมุมมองมุมมองจึงต้องส่งข้อมูลเป็นอาร์กิวเมนต์ ผู้นำเสนอสามารถสื่อสารกลับไปที่มุมมองโดยใช้ฟังก์ชั่น events / callback ซึ่งมุมมองต้องฟัง
ผู้นำเสนอมีการอ้างอิงเพื่อดู
ในสถานการณ์สมมติมุมมองจะแสดงคุณสมบัติของข้อมูลที่แสดงให้ผู้ใช้เห็น ผู้นำเสนอฟังเหตุการณ์และปรับเปลี่ยนคุณสมบัติในมุมมอง:
Presenter.SomeEvent(Sender)
{
DomainObject.DoSomething(View.SomeProperty);
View.SomeOtherProperty = DomainObject.SomeData;
}
ทั้งคู่มีการอ้างอิงถึงกันและกันซึ่งก่อให้เกิดการพึ่งพาแบบวงกลม
สถานการณ์นี้จริง ๆ แล้วง่ายต่อการใช้งานมากกว่าที่อื่น ๆ มุมมองตอบสนองต่อเหตุการณ์โดยวิธีการโทรในผู้นำเสนอ ผู้นำเสนออ่าน / แก้ไขข้อมูลจากมุมมองผ่านคุณสมบัติที่เปิดเผย
View.SomeEvent(Sender)
{
Presenter.DoSomething();
}
Presenter.DoSomething()
{
View.SomeProperty = DomainObject.Calc(View.SomeProperty);
}
มีปัญหาอื่น ๆ ที่ต้องพิจารณาด้วยรูปแบบ MVP ลำดับการสร้างอายุการใช้งานของวัตถุที่การเดินสายเกิดขึ้นการสื่อสารระหว่าง MVP triads แต่คำตอบนี้เติบโตนานพอแล้ว