Theo kinh nghiệm của tôi, trong một chương trình gui mvc máy tính để bàn truyền thống, bộ điều khiển kết thúc được đưa vào xem. Hầu hết mọi người không dành thời gian để đưa ra một lớp điều khiển.
Các mẫu thiết kế trong Smalltalk MVC
Bộ ba mô hình / Chế độ xem / Bộ điều khiển (MVC) [KP88] được sử dụng để xây dựng giao diện người dùng trong Smalltalk-80. Nhìn vào các mẫu thiết kế bên trong MVC sẽ giúp bạn thấy ý nghĩa của cụm từ "mẫu".
MVC bao gồm ba loại đối tượng. Model là đối tượng ứng dụng, View là phần trình bày màn hình của nó và Trình điều khiển xác định cách giao diện người dùng phản ứng với đầu vào của người dùng. Trước MVC, các thiết kế giao diện người dùng có xu hướng gộp các đối tượng này lại với nhau. MVC tách chúng ra để tăng tính linh hoạt và tái sử dụng.
MVC tách các khung nhìn và mô hình bằng cách thiết lập giao thức đăng ký / thông báo giữa chúng. Một khung nhìn phải đảm bảo rằng sự xuất hiện của nó phản ánh trạng thái của mô hình. Bất cứ khi nào dữ liệu của mô hình thay đổi, mô hình sẽ thông báo các khung nhìn phụ thuộc vào nó. Đáp lại, mỗi lượt xem có một cơ hội để tự cập nhật. Cách tiếp cận này cho phép bạn đính kèm nhiều khung nhìn vào một mô hình để cung cấp các bài thuyết trình khác nhau. Bạn cũng có thể tạo các khung nhìn mới cho một mô hình mà không cần viết lại nó.
Sơ đồ sau đây cho thấy một mô hình và ba khung nhìn. (Chúng tôi đã bỏ qua các bộ điều khiển để đơn giản.) Mô hình chứa một số giá trị dữ liệu và các khung nhìn xác định bảng tính, biểu đồ và biểu đồ hình tròn hiển thị các dữ liệu này theo nhiều cách khác nhau. Mô hình giao tiếp với các khung nhìn của nó khi các giá trị của nó thay đổi và các khung nhìn giao tiếp với mô hình để truy cập các giá trị này.
Lấy theo mệnh giá, ví dụ này phản ánh một thiết kế tách rời các khung nhìn từ các mô hình. Nhưng thiết kế có thể áp dụng cho một vấn đề chung hơn: tách các đối tượng để thay đổi thành một đối tượng có thể ảnh hưởng đến bất kỳ số lượng nào khác mà không yêu cầu đối tượng thay đổi phải biết chi tiết về các đối tượng khác. Thiết kế tổng quát hơn này được mô tả theo mẫu thiết kế của Observer (trang 293).
Một tính năng khác của MVC là các khung nhìn có thể được lồng vào nhau. Ví dụ: bảng điều khiển các nút có thể được triển khai dưới dạng chế độ xem phức tạp chứa các chế độ xem nút lồng nhau. Giao diện người dùng cho trình kiểm tra đối tượng có thể bao gồm các khung nhìn lồng nhau có thể được sử dụng lại trong trình gỡ lỗi. MVC hỗ trợ các khung nhìn lồng nhau với lớp CompositeView, một lớp con của View. Các đối tượng CompositeView hoạt động giống như các đối tượng View; một khung nhìn tổng hợp có thể được sử dụng ở bất cứ nơi nào một khung nhìn có thể được sử dụng, nhưng nó cũng chứa và quản lý các khung nhìn lồng nhau.
Một lần nữa, chúng ta có thể nghĩ về điều này như một thiết kế cho phép chúng ta đối xử với một khung nhìn tổng hợp giống như chúng ta đối xử với một trong các thành phần của nó. Nhưng thiết kế có thể áp dụng cho một vấn đề chung hơn, xảy ra bất cứ khi nào chúng ta muốn nhóm các đối tượng và coi nhóm như một đối tượng riêng lẻ. Thiết kế tổng quát hơn này được mô tả bằng mẫu thiết kế Composite (163). Nó cho phép bạn tạo một hệ thống phân cấp lớp trong đó một số lớp con xác định các đối tượng nguyên thủy (ví dụ: Nút) và các lớp khác định nghĩa các đối tượng hỗn hợp (CompositeView) để lắp ráp các nguyên thủy thành các đối tượng phức tạp hơn.
MVC cũng cho phép bạn thay đổi cách một khung nhìn phản ứng với đầu vào của người dùng mà không thay đổi cách trình bày trực quan của nó. Ví dụ, bạn có thể muốn thay đổi cách nó phản ứng với bàn phím hoặc sử dụng menu bật lên thay vì các phím lệnh. MVC đóng gói cơ chế phản hồi trong đối tượng Bộ điều khiển. Có một hệ thống phân cấp các bộ điều khiển, giúp dễ dàng tạo một bộ điều khiển mới dưới dạng một biến thể trên một bộ điều khiển hiện có.
Một khung nhìn sử dụng một thể hiện của lớp con Bộ điều khiển để thực hiện một chiến lược phản hồi cụ thể; để thực hiện một chiến lược khác, chỉ cần thay thế cá thể bằng một loại bộ điều khiển khác. Thậm chí có thể thay đổi bộ điều khiển của chế độ xem trong thời gian chạy để cho phép chế độ xem thay đổi cách nó phản ứng với đầu vào của người dùng. Ví dụ: một khung nhìn có thể bị vô hiệu hóa để nó không chấp nhận đầu vào chỉ bằng cách cung cấp cho nó một bộ điều khiển bỏ qua các sự kiện đầu vào.
Mối quan hệ Bộ điều khiển xem là một ví dụ về mẫu thiết kế Chiến lược (315). Chiến lược là một đối tượng đại diện cho một thuật toán. Nó hữu ích khi bạn muốn thay thế thuật toán tĩnh hoặc động, khi bạn có nhiều biến thể của thuật toán hoặc khi thuật toán có cấu trúc dữ liệu phức tạp mà bạn muốn gói gọn.
MVC sử dụng các mẫu thiết kế khác, chẳng hạn như Phương thức Factory (107) để chỉ định lớp trình điều khiển mặc định cho chế độ xem và Trình trang trí (175) để thêm cuộn vào chế độ xem. Nhưng các mối quan hệ chính trong MVC được đưa ra bởi các mẫu thiết kế của Observer, Composite và Strateg.