Title: ModelViewController
1Model-View-Controller
2Design Patterns
- The hard problem in O-O programming is deciding
what objects to have, and what their
responsibilities are - Design Patterns describe the higher-level
organization of solutions to common problems - Design patterns are a current hot topic in O-O
design
3The MVC pattern
- MVC stands for Model-View-Controller
- The Model is the actual internal representation
- The View (or a View) is a way of looking at or
displaying the model - The Controller provides for user input and
modification - These three components are usually implemented as
separate classes
4The Model
- Most programs are supposed to do work, not just
be "another pretty face" - but there are some exceptions
- useful programs existed long before GUIs
- The Model is the part that does the work--it
models the actual problem being solved - The Model should be independent of both the
Controller and the View - But it can provide services (methods) for them to
use - Independence gives flexibility, robustness
5The Controller
- The Controller decides what the model is to do
- Often, the user is put in control by means of a
GUI - in this case, the GUI and the Controller are
often the same - The Controller and the Model can almost always be
separated (what to do versus how to do it) - The design of the Controller depends on the Model
- The Model should not depend on the Controller
6The View
- Typically, the user has to be able to see, or
view, what the program is doing - The View shows what the Model is doing
- The View is a passive observer it should not
affect the model - The Model should be independent of the View, but
(but it can provide access methods) - The View should not display what the Controller
thinks is happening
7Combining Controller and View
- Sometimes the Controller and View are combined,
especially in small programs - Combining the Controller and View is appropriate
if they are very interdependent - The Model should still be independent
- Never mix Model code with GUI code!
8Separation of concerns
- As always, you want code independence
- The Model should not be contaminated with control
code or display code - The View should represent the Model as it really
is, not some remembered status - The Controller should talk to the Model and View,
not manipulate them - The Controller can set variables that the Model
and View can read
9The Bouncing Ball Applet
- Each click of the Step button advances the ball a
small amount - The step number and ball position are displayed
in the status line
10The Ball Applet Model
- The Ball Applet shows a ball bouncing in a window
- The Model controls the motion of the ball
- In this example, the Model must know the size of
the window - so it knows when the ball should be made to
bounce - The Model doesnt need to know anything else
about the GUI
11Sample CRC index card
12Model
13Model I
import java.util.Observableclass Model extends
Observable final int BALL_SIZE 20 int
xPosition 0 int yPosition 0 int
xLimit, yLimit int xDelta 6 int yDelta
4 // more...
14Model II
void makeOneStep ( ) xPosition
xDelta if (xPosition xPosition 0 xDelta -xDelta
// more...
15Model III
if (xPosition xLimit) xPosition
xLimit xDelta -xDelta // still
more...
16Model IV
yPosition yDelta if (yPosition yPosition yLimit) yDelta
-yDelta yPosition yDelta
setChanged() notifyObservers() // end
of makeOneStep method // end of Model class
17Model (repeated)
18The Ball Applet View
- The View needs access to the balls state (in
this case, its x-y location) - For a static drawing, the View doesnt need to
know anything else
19View
20View I
import java.awt. import java.util. class
View extends Canvas implements
Observer Controller controller Model
model int stepNumber 0 // more...
21View II
public void paint (Graphics g) g.setColor
(Color.red) g.fillOval (model.xPosition,
model.yPosition, model.BALL_SIZE,
model.BALL_SIZE) controller.showStatus
("Step "
(stepNumber)
", x " model.xPosition
", y "
model.yPosition) // end paint method
22View III
- public void update(Observable obs,
Object arg) repaint()
// end class
23View (repeated)
24The Ball Applet Controller
- The Controller tells the Model what to do
- The Controller tells the View when it needs to
refresh the display - The Controller doesnt need to know the inner
workings of the Model - The Controller doesnt need to know the inner
workings of the View
25Controller
26Controller I
import java.applet. import java.awt. import
java.awt.event. import java.util.
public class Controller extends Applet Panel
buttonPanel new Panel ( ) Button stepButton
new Button ("Step") Model model
new Model () View view new View ()
// more...
27Controller II
public void init ( ) // Lay out
components setLayout (new BorderLayout ( ))
buttonPanel.add (stepButton) this.add
(BorderLayout.SOUTH, buttonPanel) this.add
(BorderLayout.CENTER, view) // more...
28Controller III
// Attach actions to components
stepButton.addActionListener(new ActionListener (
) public void actionPerformed
(ActionEvent event)
model.makeOneStep () ) //
more...
29Controller IV
// Tell the View about myself (Controller)
and // about the Model
model.addObserver(view) view.controller
this // end init method // more...
30Controller V
public void start ( ) model.xLimit
view.getSize( ).width -
model.BALL_SIZE model.yLimit
view.getSize( ).height -
model.BALL_SIZE repaint ( ) //
end of start method // end of Controller class
31Controller (repeated)
32The End