2010-10-21 11 views
10

Stavo studiando il modello di progettazione Modello-Vista-Controller e ho compreso teoricamente il concetto alla base del modello, ma volevo dare un'occhiata a come si sarebbe effettivamente messo in pratica.
Wikipedia menzioni Wt - toolkit Web, CppCMS e alcune altre implementazioni standard che utilizzano il modello però non sono stato familiarità con questi, e speravo solo e sarà veramente grato se qualcuno può fornire alcuni esempi di codice (si spera C++) che implementa il modello e spiega la teoria del modello che viene messo in pratica.Modello Visualizza Controller Modello di progettazione Codice Esempio

risposta

21

Ecco un rapido esempio che ho fatto (non provate a compilarlo, fatemi sapere se c'è errore):

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; 
}; 

Ignorando l'attuazione di Button, in fondo questo programma utilizzerà GraphGUI per visualizzare un grafico che cambierà quando viene premuto un pulsante. Diciamo che è un grafico a barre e diventerà più alto.

Poiché il modello è indipendente dalla vista (il pulsante) e il controller gestisce la comunicazione tra i due, questo segue il modello MVC.

Quando si fa clic sul pulsante, il controller modifica il modello tramite la funzione onButtonClicked, che la classe Button sa chiamare quando viene fatto clic.

La bellezza di questo è dato dal fatto che il modello e la vista sono completamente indipendenti, l'implementazione di ognuno può cambiare drasticamente e non influenzerà l'altro, il controllore potrebbe semplicemente dover apportare alcune modifiche. Se il modello in questo caso ha calcolato alcuni risultati sulla base di alcuni dati del database, fare clic sul pulsante potrebbe far sì che ciò accada, ma l'implementazione del pulsante non dovrebbe cambiare.Oppure, invece di dire al controller quando si verifica un clic, forse può dire al controller quando il pulsante è collegato al mouse. Le stesse modifiche vengono applicate al modello, indipendentemente da ciò che ha attivato le modifiche.

+1

In MVC, la vista di solito non è a conoscenza del controller. In genere, il Controller dovrebbe conoscere il modello e la vista e fornire la vista con l'istanza appropriata del modello. Il modello, come hai detto, non è a conoscenza della vista. –

+0

@ Matt, robdev: il modello non è a conoscenza della vista ma Model può visualizzare la visualizzazione dell'aggiornamento nei suoi dati .. (tipico utilizzo del pattern Observor) –

+0

@Matt, beh, vedo il tuo punto, ma in questo esempio la vista non viene visualizzata t sapere esplicitamente sul controller. Viene appena dato un puntatore a oggetti e funzioni e dice "chiunque tu sia, sono stato appena cliccato! Chiama la tua funzione" e viene chiamato onButtonClicked(). – robev

2

Un semplice editor di testo può essere progettato in base a MVC. Pensa alla classe string come al modello, in cui sono archiviati i dati. Potremmo avere una classe chiamata SimpleTextView che visualizza il testo nello string collegato ad esso, così com'è. Una classe chiamata KeyboardEventHandler può fungere da controller. Il controller notificherà la visualizzazione dei nuovi eventi della tastiera. La vista a sua volta modifica il modello (come aggiungere o rimuovere testo). Le modifiche nel modello si riflettono su tutte le viste ad esso allegate. Ad esempio, potrebbe essere presente un'altra vista denominata HtmlView allegata all'oggetto string manipolato all'interno dello SimpleTextView. Se l'utente inserisce tag HTML validi nel SimpleTextView, lo HtmlView visualizzerà l'output formattato - in tempo reale.

1

Ci sono un paio di esempi MVC completi, oltre a discussioni, in c 2 di un'introduzione alla programmazione in Python 3.x che ho scritto (non ho completato ch 3 ecc., Quel progetto è stato in ghiaccio per qualche tempo - La comunità Python amava davvero lo sciame arrabbiato di api quando ho scoperto che avevo scritto che Python forse non era adatto per uno sviluppo su larga scala, quindi è diventato difficile ottenere un feedback ragionevole). È disponibile in formato PDF dal Google Docs. Non so quanto bene si associ alle comuni implementazioni MVC, ero principalmente interessato a far passare l'idea generale. . :-)

Acclamazioni & hth,

PS: C'è una bella tabella di contenuti nel file PDF ma Google Docs non vederlo. Avresti bisogno di dl e usare Foxit o Acrobat o qualche altro visualizzatore di PDF. Penso che ci sia un TOC visibile a parte per Google Docs, tuttavia, non ho controllato e non ricordo se aggiornato.

PPS: Dimenticato di menzionare, l'esempio di elaborazione delle immagini MVC vicino alla fine ha una bella foto di Lena Söderberg! :)

1

Codice è l'approccio migliore per capire e imparare Model View Controller:

Ecco un semplice esempio JS (da 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; 

Ecco un post dettagliato in C/C++ Model-View-Controller Explained in C++

MVC

Problemi correlati