2010-10-21 34 views
10

Tôi đang nghiên cứu mẫu thiết kế Model-View-Controller và tôi hiểu khái niệm đằng sau mẫu lý thuyết, nhưng tôi muốn xem qua cách thực tế sẽ đưa nó vào thực hành.
Wikipedia đề cập đến Wt - Bộ công cụ Web, CppCMS và một số triển khai tiêu chuẩn khác sử dụng mẫu, tuy nhiên tôi đã không quen thuộc với điều này, và tôi chỉ hy vọng và sẽ thực sự biết ơn nếu có ai có thể cung cấp một số mã mẫu (hy vọng C++) thực hiện mô hình và giải thích lý thuyết về mô hình được đưa vào thực hành.Mẫu View Controller Design Mã mẫu Ví dụ

Trả lời

21

Dưới đây là một ví dụ nhanh tôi đã thực hiện (không cố gắng biên soạn nó, cho tôi biết nếu có lỗi):

class Button; // Prewritten GUI element 

class GraphGUI { 
public: 
    GraphGUI() { 
     _button = new Button("Click Me"); 
     _model = new GraphData(); 
     _controller = new GraphController(_model, _button); 
    } 
    ~GraphGUI() { 
     delete _button; 
     delete _model; 
     delete _controller; 
    } 

    drawGraph() { 
     // Use model's data to draw the graph somehow 
    } 
    ... 

private: 
    Button*    _button; 
    GraphData*   _model; 
    GraphController*  _controller; 
}; 

class GraphData { 
public: 
    GraphData() { 
     _number = 10; 
    } 
    void increaseNumber() { 
     _number += 10; 
    } 
    const int getNumber() { return _number; } 
private: 
    int _number; 
}; 

class GraphController { 
public: 
    GraphController(GraphData* model, Button* button) { 
     __model = model; 
     __button = button; 
     __button->setClickHandler(this, &onButtonClicked); 
    } 

    void onButtonClicked() { 
     __model->increaseNumber(); 
    } 

private: 
    // Don't handle memory 
    GraphData* __model; 
    Button*  __button; 
}; 

Bỏ qua việc thực hiện các Button, về cơ bản chương trình này sẽ sử dụng GraphGUI để hiển thị một biểu đồ sẽ thay đổi khi nhấn nút. Giả sử đó là biểu đồ dạng thanh và nó sẽ cao hơn.

Vì mô hình độc lập với chế độ xem (nút) và bộ điều khiển xử lý giao tiếp giữa hai thiết bị, điều này tuân theo mẫu MVC.

Khi nút được nhấp, bộ điều khiển sửa đổi mô hình thông qua chức năng onButtonClicked, mà lớp Button biết để gọi khi được nhấp. Vẻ đẹp của điều này là do mô hình và chế độ xem hoàn toàn độc lập, việc thực hiện mỗi mô hình có thể thay đổi đáng kể và nó sẽ không ảnh hưởng đến bộ điều khiển khác, bộ điều khiển có thể chỉ cần thực hiện một vài thay đổi. Nếu mô hình trong trường hợp này tính toán một số kết quả dựa trên một số dữ liệu cơ sở dữ liệu, sau đó nhấp vào nút có thể gây ra điều này xảy ra, nhưng việc thực hiện nút sẽ không phải thay đổi.Hoặc, thay vì nói với bộ điều khiển khi một nhấp chuột xảy ra, có thể nó có thể báo cho bộ điều khiển khi nút được kết nối. Các thay đổi tương tự được áp dụng cho mô hình, bất kể những gì đã kích hoạt các thay đổi.

+1

Trong MVC, chế độ xem thường không nhận thức được Bộ điều khiển. Thông thường, Controller sẽ nhận thức được Model và View, và sẽ cung cấp View với thể hiện thích hợp của Model. Mô hình, như bạn đã đề cập, không biết về Chế độ xem. –

+0

@ Matt, robdev: Mô hình không biết gì về chế độ xem nhưng Mô hình có thể gắn kết Chế độ xem cập nhật trong dữ liệu của nó .. (sử dụng điển hình mẫu quan sát) –

+0

@Matt, tôi thấy quan điểm của bạn, nhưng trong ví dụ này, chế độ xem không hiển thị t một cách rõ ràng biết về bộ điều khiển. Nó chỉ được đưa ra một đối tượng và con trỏ hàm và nói "bất cứ ai bạn đang có, tôi đã chỉ cần nhấp vào Gọi chức năng của bạn", và onButtonClicked() sau đó được gọi là. – robev

2

Trình soạn thảo văn bản đơn giản có thể được thiết kế dựa trên MVC. Hãy nghĩ về lớp string làm mô hình, nơi dữ liệu được lưu trữ. Chúng tôi có thể có một lớp được gọi là SimpleTextView hiển thị văn bản trong số string được đính kèm với nó, giống như vậy. Một lớp được gọi là KeyboardEventHandler có thể hoạt động như bộ điều khiển. Bộ điều khiển sẽ thông báo cho chế độ xem về các sự kiện bàn phím mới. Chế độ xem lần lượt sửa đổi mô hình (như thêm hoặc xóa văn bản). Các thay đổi trong mô hình được phản ánh trên tất cả các khung nhìn được đính kèm với nó. Ví dụ: có thể có một chế độ xem khác được gọi là HtmlView được gắn vào đối tượng string được điều khiển từ bên trong SimpleTextView. Nếu người dùng nhập các thẻ HTML hợp lệ vào số SimpleTextView, thì HtmlView sẽ hiển thị đầu ra được định dạng - thời gian thực.

1

Có một vài ví dụ MVC đầy đủ, cùng với phần thảo luận, trong phần 2 giới thiệu về lập trình bằng Python 3.x mà tôi đã viết (Tôi chưa hoàn thành ch 3, v.v.) - Cộng đồng Python thực sự thích bầy tức giận của ong khi phát hiện ra tôi đã viết rằng Python có lẽ không thích hợp để phát triển quy mô rất lớn, do đó rất khó để có được phản hồi hợp lý). Nó có sẵn ở định dạng PDF từ Google Docs. Tôi không biết làm thế nào nó bản đồ để thực hiện MVC phổ biến, tôi đã được chủ yếu là quan tâm đến việc có ý tưởng chung trên. . :-)

Cheers & hth,

PS: Có một bảng tốt đẹp của nội dung trong file PDF nhưng Google Docs không hiển thị nó. Bạn cần phải dl và sử dụng Foxit hoặc Acrobat hoặc một số trình xem PDF khác. Tôi nghĩ rằng có một TOC có thể xem riêng biệt tại Google Documents, tuy nhiên, chưa kiểm tra và không nhớ có cập nhật hay không.

PPS: Quên đề cập đến, ví dụ xử lý hình ảnh MVC gần cuối có hình ảnh đẹp của Lena Söderberg! :)

1

Mã là cách tiếp cận tốt nhất để hiểu và học hỏi Model View Controller:

Dưới đây là một ví dụ JS đơn giản (từ Wiki)

/** Model, View, Controller */ 
var M = {}, V = {}, C = {}; 

/** Model stores data */ 
M.data = "hello world"; 

/** View controls what to present */ 
V.render = (M) => { alert(M.data); } 

/** Controller bridges View and Model */ 
C.handleOnload =() => { V.render(M); } 

/** Controller on Windows OnLoad event */ 
window.onload = C.handleOnload; 

Đây là một bài chi tiết trong C/C++ Model-View-Controller Explained in C++

MVC

Các vấn đề liên quan