จากประสบการณ์ของฉันในโปรแกรม mvc gui แบบเดสก์ท็อปคอนโทรลเลอร์จะสิ้นสุดลงในมุมมอง คนส่วนใหญ่ไม่ใช้เวลาในการแยกชั้นควบคุม
รูปแบบการออกแบบใน Smalltalk MVC
Model / View / Controller (MVC) สามชั้นของคลาส [KP88] ใช้เพื่อสร้างส่วนต่อประสานกับผู้ใช้ใน Smalltalk-80 การดูรูปแบบการออกแบบภายใน MVC จะช่วยให้คุณเห็นความหมายของคำว่า "รูปแบบ"
MVC ประกอบด้วยวัตถุสามชนิด รุ่นเป็นวัตถุของแอปพลิเคชันมุมมองคือการนำเสนอหน้าจอและคอนโทรลเลอร์กำหนดวิธีที่ส่วนต่อประสานผู้ใช้ตอบสนองต่อการป้อนข้อมูลของผู้ใช้ ก่อน MVC การออกแบบส่วนต่อประสานผู้ใช้มีแนวโน้มที่จะรวมวัตถุเหล่านี้เข้าด้วยกัน MVC แยกส่วนเพื่อเพิ่มความยืดหยุ่นและนำกลับมาใช้ใหม่
MVC แยกมุมมองและโมเดลโดยสร้างโปรโตคอลบอกรับสมาชิก / แจ้งเตือนระหว่างพวกเขา มุมมองต้องตรวจสอบให้แน่ใจว่าลักษณะที่ปรากฏนั้นสะท้อนถึงสถานะของโมเดล เมื่อใดก็ตามที่ข้อมูลของโมเดลเปลี่ยนแปลงโมเดลจะแจ้งมุมมองที่ขึ้นอยู่กับมัน ในการตอบกลับแต่ละมุมมองจะมีโอกาสอัปเดตตัวเอง วิธีนี้ช่วยให้คุณแนบหลายมุมมองเข้ากับโมเดลเพื่อจัดเตรียมการนำเสนอที่แตกต่างกัน คุณยังสามารถสร้างมุมมองใหม่สำหรับโมเดลโดยไม่ต้องเขียนใหม่
แผนภาพต่อไปนี้แสดงรูปแบบและมุมมองสามมุมมอง (เราออกจากตัวควบคุมเพื่อความเรียบง่าย) โมเดลมีค่าข้อมูลบางส่วนและมุมมองที่กำหนดสเปรดชีตฮิสโตแกรมและแผนภูมิวงกลมแสดงข้อมูลเหล่านี้ในรูปแบบต่างๆ โมเดลสื่อสารกับมุมมองเมื่อค่าเปลี่ยนแปลงและมุมมองสื่อสารกับโมเดลเพื่อเข้าถึงค่าเหล่านี้
ตัวอย่างนี้สะท้อนถึงการออกแบบที่แยกแยะมุมมองจากโมเดล แต่การออกแบบนั้นสามารถใช้ได้กับปัญหาทั่วไปที่มากกว่า: การแยกวัตถุออกเพื่อให้การเปลี่ยนแปลงหนึ่งสามารถส่งผลกระทบต่อจำนวนของคนอื่น ๆ โดยไม่ต้องให้วัตถุที่ถูกเปลี่ยนไปรู้รายละเอียดของคนอื่น การออกแบบทั่วไปนี้อธิบายโดยรูปแบบการออกแบบของ Observer (หน้า 293)
คุณสมบัติอื่นของ MVC คือสามารถซ้อนมุมมองได้ ตัวอย่างเช่นแผงควบคุมของปุ่มอาจถูกนำมาใช้เป็นมุมมองที่ซับซ้อนที่มีมุมมองปุ่มซ้อน อินเทอร์เฟซผู้ใช้สำหรับตัวตรวจสอบวัตถุสามารถประกอบด้วยมุมมองซ้อนที่อาจนำมาใช้ใหม่ในการดีบักเกอร์ MVC รองรับมุมมองแบบซ้อนด้วยคลาส CompositeView คลาสย่อยของมุมมอง วัตถุ CompositeView ทำหน้าที่เหมือนดูวัตถุ มุมมองคอมโพสิตสามารถใช้ได้ทุกที่ที่สามารถใช้มุมมองได้ แต่ก็ยังมีและจัดการมุมมองแบบซ้อน
อีกครั้งเราอาจคิดว่านี่เป็นการออกแบบที่ช่วยให้เราปฏิบัติต่อมุมมองคอมโพสิตเหมือนกับที่เราปฏิบัติต่อหนึ่งในองค์ประกอบ แต่การออกแบบนั้นสามารถใช้ได้กับปัญหาทั่วไปที่เกิดขึ้นเมื่อใดก็ตามที่เราต้องการจัดกลุ่มวัตถุและปฏิบัติต่อกลุ่มเหมือนวัตถุแต่ละชิ้น การออกแบบทั่วไปนี้อธิบายโดยรูปแบบการออกแบบคอมโพสิต (163) มันช่วยให้คุณสร้างลำดับชั้นของคลาสที่คลาสย่อยบางตัวกำหนดวัตถุดั้งเดิม (เช่นปุ่ม) และคลาสอื่น ๆ จะกำหนดวัตถุผสม (CompositeView) ที่รวบรวมวัตถุโบราณเข้าด้วยกันเป็นวัตถุที่ซับซ้อนมากขึ้น
MVC ยังช่วยให้คุณเปลี่ยนวิธีการที่มุมมองตอบสนองต่อการป้อนข้อมูลของผู้ใช้โดยไม่เปลี่ยนการนำเสนอด้วยภาพ คุณอาจต้องการเปลี่ยนวิธีการตอบสนองต่อคีย์บอร์ดเช่นหรือใช้เมนูป็อปอัพแทนปุ่มคำสั่ง MVC encapsulate กลไกการตอบสนองในวัตถุคอนโทรลเลอร์ มีลำดับชั้นของตัวควบคุมที่ทำให้ง่ายต่อการสร้างตัวควบคุมใหม่เป็นรูปแบบหนึ่งที่มีอยู่
มุมมองใช้อินสแตนซ์ของคลาสย่อยคอนโทรลเลอร์เพื่อใช้กลยุทธ์การตอบกลับเฉพาะ ในการใช้กลยุทธ์ที่แตกต่างเพียงแค่แทนที่อินสแตนซ์ด้วยคอนโทรลเลอร์ชนิดอื่น อาจเป็นไปได้ที่จะเปลี่ยนคอนโทรลเลอร์ของมุมมองในขณะใช้งานเพื่อให้มุมมองเปลี่ยนวิธีการตอบสนองต่ออินพุตของผู้ใช้ ตัวอย่างเช่นมุมมองสามารถปิดการใช้งานเพื่อที่จะไม่ยอมรับอินพุตเพียงแค่ให้มันเป็นตัวควบคุมที่ละเว้นเหตุการณ์อินพุต
ความสัมพันธ์ View-Controller เป็นตัวอย่างของรูปแบบการออกแบบ Strategy (315) กลยุทธ์เป็นวัตถุที่แสดงถึงอัลกอริทึม มันมีประโยชน์เมื่อคุณต้องการแทนที่อัลกอริทึมทั้งแบบคงที่หรือแบบไดนามิกเมื่อคุณมีความหลากหลายของอัลกอริทึมหรือเมื่ออัลกอริทึมมีโครงสร้างข้อมูลที่ซับซ้อนที่คุณต้องการแค็ปซูล
MVC ใช้รูปแบบการออกแบบอื่น ๆ เช่นวิธีโรงงาน (107) เพื่อระบุคลาสตัวควบคุมเริ่มต้นสำหรับมุมมองและตัวตกแต่ง (175) เพื่อเพิ่มการเลื่อนไปยังมุมมอง แต่ความสัมพันธ์หลักใน MVC นั้นมาจากรูปแบบการออกแบบของผู้สังเกตการณ์คอมโพสิตและกลยุทธ์