model view controller pattern patterns model-view-controller

38
Model View Controller Pattern • Patterns • Model-View-Controller

Post on 21-Dec-2015

234 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Model View Controller Pattern Patterns Model-View-Controller

Model View Controller Pattern

• Patterns

• Model-View-Controller

Page 2: Model View Controller Pattern Patterns Model-View-Controller

A Single Class

T result = I;T nextValue = getNextValue()while (!isSentinel(nextValue)) { result = f(result, nextValue); nextValue = getNextValue(..);}

Folding Intra-Class PatternLoan, int new ALoan(0), 1

ALoan.add(), *

>= 0

Page 3: Model View Controller Pattern Patterns Model-View-Controller

Scanning Inter-Class Pattern

Scanner Instance

Enumeration Interface

Scanner User

public interface <Type>Enumeration { public <Type> nextElement(); public boolean hasMoreElements();

}

Page 4: Model View Controller Pattern Patterns Model-View-Controller

Architectural Pattern

• Christopher 79– Each pattern is a three part rule, which

expresses a relation between a certain context, a problem, and a solution.

– Each pattern describes a problem which occurs over and over again in our environment, and then describes the core of a solution to that problem, in such a way that you can use this solution a million times over

Page 5: Model View Controller Pattern Patterns Model-View-Controller

Book on Design Patterns

Page 6: Model View Controller Pattern Patterns Model-View-Controller

MVC Pattern

Model:APointHistoryModel

instance

Controller:AConsoleControllerinstance

Controller:AnAWTControllerinstance

Controller:AnAWTControllerinstance

Controller:ASwingControllerinstance

View:AConsoleViewinstance

View:ABarChartViewinstance

View:APlotterViewinstance

View:Aplotterviewinstance

Page 7: Model View Controller Pattern Patterns Model-View-Controller

Displaying Points

Page 8: Model View Controller Pattern Patterns Model-View-Controller

Displaying Points

Swing button

AWT button

Swing Detachable Toolbar

Page 9: Model View Controller Pattern Patterns Model-View-Controller

Displaying Points

All four views displayed concurrently and kept in Sync.

Page 10: Model View Controller Pattern Patterns Model-View-Controller

ObjectEditor-based Structure

APointHistory ObjectEditor

Page 11: Model View Controller Pattern Patterns Model-View-Controller

Reusing Point History

APointHistoryUser Interface Code:

Single Main Class

Page 12: Model View Controller Pattern Patterns Model-View-Controller

More Modular ApproachEditor:AConsoleEditor

Editor:ASwingPlotterEditor

Editor:ABarChartEditor

Editor:AnAWTPlotterEditor

Composer:Single Main

ClassAPointHistory

Page 13: Model View Controller Pattern Patterns Model-View-Controller

Sharing the View

Page 14: Model View Controller Pattern Patterns Model-View-Controller

Sharing the Controller

Page 15: Model View Controller Pattern Patterns Model-View-Controller

Controller Without View

Page 16: Model View Controller Pattern Patterns Model-View-Controller

View Without Controller

Page 17: Model View Controller Pattern Patterns Model-View-Controller

Monolithic Editor

AWT Plotter Editor

APointHistory

Page 18: Model View Controller Pattern Patterns Model-View-Controller

Separate View and Controller

Controller:AnAWTController

View:ABarchartView

APointHistory

addElement( ) size( )elementAt( )

Performs Input Performs Output

Write methods

Read methods

Page 19: Model View Controller Pattern Patterns Model-View-Controller

Multiple Views and Controllers

APointHistory

Controller:AConsoleController

Controller:AnAWTController

Controller:AnAWTController

Controller:ASwingController

View:AConsoleView

View:ABarChartView

View:APlotterView

View:APlotterView

Syncing Controllers and Views?

Page 20: Model View Controller Pattern Patterns Model-View-Controller

Model View Controller Framework

Model:APointHistoryModel

Controller:AConsoleController

Controller:AnAWTController

Controller:AnAWTController

Controller:ASwingController

View:AConsoleView

View:ABarChartView

View:APlotterView

View:APlotterView

Changed object notifies views

ListenableListeners

Page 21: Model View Controller Pattern Patterns Model-View-Controller

Model View Controller Framework

Model:APointHistoryModel

Controller:AConsoleController

Controller:AnAWTController

Controller:AnAWTController

Controller:ASwingController

View:AConsoleView

View:ABarChartView

View:APlotterView

View:APlotterView

Composer:Single Main

Class

Composer connects models, views, controllers

Page 22: Model View Controller Pattern Patterns Model-View-Controller

Class Vs Instance

Model:APointHistoryModel

Controller:AConsoleController

Controller:AnAWTController

Controller:AnAWTController

Controller:ASwingController

View:AConsoleView

View:ABarChartView

View:APlotterView

View:APlotterView

Composer:Single Main

Class

Different State

Page 23: Model View Controller Pattern Patterns Model-View-Controller

MVC Framework

Model:APointHistoryModel

Instance

Controller:AConsoleControllerinstance

Controller:AnAWTControllerinstance

Controller:AnAWTControllerinstance

Controller:ASwingControllerinstance

View:AConsoleViewinstance

View:ABarChartViewinstance

View:APlotterViewinstance

View:APlotterViewinstance

Composer:Single Main

Class

Page 24: Model View Controller Pattern Patterns Model-View-Controller

Model

Model:APointHistoryModel

Instance

Controller:AConsoleControllerinstance

Controller:AnAWTControllerinstance

Controller:AnAWTControllerinstance

Controller:ASwingControllerinstance

View:AConsoleViewinstance

View:ABarChartViewinstance

View:APlotterViewinstance

View:APlotterViewinstance

Composer:Single Main

Class

Page 25: Model View Controller Pattern Patterns Model-View-Controller

Model Vs PointHistory

APointHistory Instance

Controller:AConsoleControllerinstance

Controller:AnAWTControllerinstance

Controller:AnAWTControllerinstance

Controller:ASwingControllerinstance

View:AConsoleViewinstance

View:ABarChartViewinstance

View:APlotterViewinstance

View:APlotterViewinstance

Composer:Single Main

Class

Page 26: Model View Controller Pattern Patterns Model-View-Controller

Reusing PointHistory

PointHistory APointHistoryIMPLEMENTS

APointHistoryModel

EXTENDS

PointModel

EXTENDS

IMPLEMENTS

Page 27: Model View Controller Pattern Patterns Model-View-Controller

Notification Scheme

Model:APointHistoryModel

Instance

View:AConsoleViewinstance

View:ABarChartViewinstance

View:APlotterViewinstance

View:APlotterViewinstance

• Each view is registered with model.

• Each write method in model calls a notification method in each view.

•Notification method updates display.

Model:PointModel

Instance (Animating Point)

• Each student is registered with professor’s listserv.

• When web page is updated mail sent to students.

•Student reads web page.

Page 28: Model View Controller Pattern Patterns Model-View-Controller

View with Multiple Models

APointHistoryModel InstancePointModel

Instance

Page 29: Model View Controller Pattern Patterns Model-View-Controller

General Notification Scheme

Model:APointHistoryModel

Instance

View:AConsoleViewinstance

View:ABarChartViewinstance

View:APlotterViewinstance

View:APlotterViewinstance

•View may have multiple models with common notification method.

•Notification method parameter indicates which model.

Model:PointModel

Instance (Animating Point)

Page 30: Model View Controller Pattern Patterns Model-View-Controller

PointHistoryModel & PointHistoryListener

public interface PointHistoryModel extends PointHistory {public void addListener (PointHistoryListener pointHistoryListener);public void removeListener (PointHistoryListener pointHistoryListener);

}

public interface PointHistoryListener {public void pointHistoryUpdated(PointHistory pointHistory);

}

Called whenever model is updatedUpdated object (model)

View (console, barchart, plotter ..)

Common interface of all views

Page 31: Model View Controller Pattern Patterns Model-View-Controller

APointHistoryModelimport java.util.Vector;import java.util.Enumeration;public class APointHistoryModel extends APointHistory implements PointHistoryModel {

public void addElement (int x, int y) {super.addElement(x, y);notifyListeners();

}Vector listeners = new Vector();public void addListener (PointHistoryListener pointHistoryListener) {

listeners.addElement(pointHistoryListener);}public void removeListener (PointHistoryListener pointHistoryListener) {

listeners.removeElement(pointHistoryListener);}void notifyListeners() {

Enumeration elements = listeners.elements();while (elements.hasMoreElements())

((PointHistoryListener) elements.nextElement()).pointHistoryUpdated(this);

}}

Object evaluating expression (Object on which enclosing method executed)

Each write method notifies.

Page 32: Model View Controller Pattern Patterns Model-View-Controller

Console Viewimport shapes.PointModel;public class APointHistoryConsoleView implements PointHistoryListener {

public void pointHistoryUpdated(PointHistory pointHistory) {System.out.println ("**********");for (int i = 0; i < pointHistory.size(); i++) {

PointModel nextPoint = (PointModel) pointHistory.elementAt(i);

System.out.println("(" + nextPoint.getX() + "," + nextPoint.getY() + ")");

}System.out.println ("**********");

}}

Page 33: Model View Controller Pattern Patterns Model-View-Controller

Displaying Points

View updated whenever any controller changes model

Page 34: Model View Controller Pattern Patterns Model-View-Controller

Console Controller

public class APointHistoryConsoleController implements PointHistoryConsoleController {

PointHistory pointHistory ;public APointHistoryConsoleController (PointHistory thePointHistory) {

pointHistory = thePointHistory;}public void processCommands() {

while (true){System.out.println("Please enter new point:");String input = Keyboard.readString();if (input.equals("quit")) break;int x = Integer.parseInt(input);int y = Keyboard.readInt();pointHistory.addElement (x,y);

}}

}

Output method not called directly

Page 35: Model View Controller Pattern Patterns Model-View-Controller

Console Composerpublic class APointHistoryConsoleComposer { public static void main (String args[]) {

PointHistoryModel pointHistoryModel = new APointHistoryModel();createConsoleEditor(pointHistoryModel);

} public static void createConsoleEditor(PointHistoryModel pointHistoryModel) {

createConsoleView(pointHistoryModel);createConsoleController(pointHistoryModel).processCommands();

} public static PointHistoryListener createConsoleView(PointHistoryModel pointHistoryModel) {

PointHistoryListener pointHistoryView = new APointHistoryConsoleView (); pointHistoryModel.addListener(pointHistoryView); return pointHistoryView; } public static PointHistoryConsoleController createConsoleController(PointHistory pointHistory) {

return new APointHistoryConsoleController(pointHistory); }}

Page 36: Model View Controller Pattern Patterns Model-View-Controller

PointHistoryModel & PointHistoryListener

public interface PointHistoryModel extends PointHistory {public void addListener (PointHistoryListener pointHistoryListener);public void removeListener (PointHistoryListener pointHistoryListener);

}

public interface PointHistoryListener {public void pointHistoryUpdated(PointHistory pointHistory);

}

Page 37: Model View Controller Pattern Patterns Model-View-Controller

Using a More Specific Type

public interface PointHistoryModel extends PointHistory {public void addListener (PointHistoryListener pointHistoryListener);public void removeListener (PointHistoryListener pointHistoryListener);

}

public interface PointHistoryListener {public void pointHistoryUpdated(PointHistoryModel pointHistoryModel);

}

specific type

Allows less polymorphism

pointHistoryUpdated does not call addListener or removeListener

Page 38: Model View Controller Pattern Patterns Model-View-Controller

Using Most General Type Possible

public interface PointHistoryModel extends PointHistory {public void addListener (PointHistoryListener pointHistoryListener);public void removeListener (PointHistoryListener pointHistoryListener);

}

public interface PointHistoryListener {public void pointHistoryUpdated(PointHistory pointHistory);

}

More general type

Allows more polymorphism

pointHistoryUpdated does not call addListener or removeListener

PointHistoryModel can be assigned