• Design Patterns Design patterns Design Patterns and Graphical User Interfaces

Transcription

• Design Patterns Design patterns Design Patterns and Graphical User Interfaces
Design patterns
Design Patterns and
Graphical
p
User Interfaces
Horstmann 5-5.4.1, 5.4.3-5.7
• Design Patterns
•
•
•
•
•
Iterator
Model-View-Controller
Model
View Controller and Observer
Strategy
Composite
Decorator
Design patterns
• For each design pattern
– Prototypical example
– Context, problem
– Solution,
Solution decoupling/interface
– UML diagram
• Patterns
– Iterator, observer, strategy, composite,
decorator
Design patterns
• Design Patterns
• Iterator
•
•
•
•
Model View Controller and Observer
Model-View-Controller
Strategy
Composite
Decorator
Example:
Example:
accessing elements in an ArrayList
Accessing elements in arbitrary container
ArrayList<String> filmList = new ArrayList<String>();
filmList.add(”E.T.”); filmList.add(”Gran Torino”);
• Printing all elements
for (String film : filmList) System.out.println(film);
• Printing all elements using iterator
Iterator<String> iter = filmList.iterator();
while (iter.hasNext()) System.out.println(iter.next());
public Class FilmCatalogue {
private String[] films = {”Dogville”,”Chinatown”};
public String get(int i) {return films[i];}
public int size() {return films.length;}
}
• Uses encapsulation: YES
• Fully decoupled: NO
– Only ”manual” printing of elements in a FilmCatalogue object possible
– very inefficient if array representation changed to linked lists
1
2
3
4
5
6
...
• Printing all elements ”manually”
for (int i=0; i< filmList.size(); i++)
System.out.println(filmList.get(i));
E.T.
Gran T.
E.T.
Gran T.
1
Example:
Better: decoupling with iterator:
accessing elements in iterable FilmCatalogue
FilmCatalogue filmList = new ArrayList<String>();
filmList.add(”E.T.”); filmList.add(”Gran Torino”);
FilmCatalogue filmList = new FilmCatalogue();
• Printing all elements
public class FilmCatalogue
p
g
implements
p
Iterable<String>
g {
public Iterator<String> iterator() {
return new Iterator<String>() {
private int position = 0;
public boolean hasNext() {return position<films.length;}
public String next() {
if (hasNext()) return films[position++];
else return null;
}
... }; } ... }
for (String film : filmList) System.out.println(film);
• Printing all elements using iterator
Iterator<String> iter = filmList.iterator();
while (iter.hasNext()) System.out.println(iter.next());
• Printing all elements ”manually”
for (int i=0; i< filmList.size(); i++)
System.out.println(filmList.get(i));
Iterator Pattern
Iterator Pattern
Context
• An aggregate object contains element objects
• Clients need access to the element objects
• The aggregate object should not expose its internal
structure
• Multiple
M lti l clients
li t may wantt iindependent
d
d t access
Solution
• Define an iterator that fetches one element at a time
• Each iterator object keeps track of the position of the
next element
• If there are several aggregate/iterator variations, it is
best if the aggregate and iterator classes realize
common interface types.
Iterator Pattern
EXAMPLE
Library myLib = new Library(...);
Iterable
<String>
Iterator
<String>
iterator()
next()
! hasNext()
next()
t()
FilmCatalogue
anonymous
QUIZ
Which of the code pieces
obey the iterator pattern in
the UML diagram ?
1.None
2.A only
3.B only
4.C only
5.D only
6.Two of A,B,C,D
7.Three of A,B,C,D
8.All of A,B,C,D
9.I don’t know
A
for (Book text : myLib)
System.out.println(text);
B
Iterator<Book> iter = myLib.iterator();
while (iter.hasNext())
System.out.println(iter.next());
C
Book[] list = myLib.getBooks();
for (int i=0; i< list.length; i++)
System.out.println(list[i]);
D
for (Book text : myLib.getBooks())
System.out.println(text);
2
Design patterns
Model/View/Controller Extra/changed
view
transparent to
content
• Design Patterns
• Iterator
• Model
Model-View-Controller
View Controller and
Observer
• Strategy
• Composite
• Decorator
Model/View/Controller
Model/View/Controller
• Model: data structure, no visual representation
• Views: visual representations
• Controllers: user interaction
• Views/controllers update model
• Model tells views that data has changed
• Views redraw themselves
Button / Listener
• recall old example
helloButton.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent event) {
textField.setText("Hello, World");
}
}
);
Observer Pattern
• Model notifies views when something interesting happens
• Button notifies action listeners when something interesting
happens
• Views attach themselves to model in order to be notified
• Action listeners attach themselves to button in order to be
notified
• Generalize: Observers attach themselves to subject
3
Observer Pattern
Observer Pattern
JButton
ActionListener
addActionListener()
actionPerformed()
anonymous
Design patterns
Display Components
Button Components
QUIZ
Which interpretations
are reasonable?
1.None
2.a
3.b
4.c
5.a+b
6.a+c
7.b+c
8.a+b+c
9.I dont’t know
a) MVC:
Frame is Model
Display Components are Views
Buttons are Controllers
b) MVC:
Model is not visible, but contains a number
Display Components are Views
Listeners attached to Buttons are Controllers
c) Observer:
• Design Patterns
• Iterator
• Model-View-Controller and Observer
• Strategy
• Composite
• Decorator
A Button is a Subject
A Listener attached to a button is an Observer
Layout Managers
GUI: components and containers
textfield
component
3 button
components
label
component
frame container
with 5 components (textfield, 3 buttons, label)
•
•
•
•
•
User interfaces made up of components
Components placed in containers
Container needs to arrange components
Swing doesn
doesn'tt use hard-coded pixel coordinates
Advantages:
– Can switch "look and feel"
– Can internationalize strings
• Layout manager controls arrangement
4
Layout Managers
Example
JPanel decDisplay = new JPanel();
final JTextField digits = new JTextField(“98",15);
decDisplay.add(new JLabel("Decimal:"));
decDisplay.add(digits);
JPanel Default :
FlowLayout
JPanel display = new JPanel();
display.setLayout(new BorderLayout());
display.add(decDisplay, BorderLayout.NORTH);
display.add(binDisplay, BorderLayout.SOUTH);
Layout Managers
Example
JPanel keyboard = new JPanel();
keyboard.setLayout(new GridLayout(2,2));
keyboard.add(new JButton("0"));
keyboard.add(new JButton("inc"));
keyboard.add(new JButton("1"));
keyboard.add(new JButton("dec"));
GridLayout
JFrame Default :
BorderLayout
JFrame f = new JFrame();
f.add(display,BorderLayout.NORTH);
f.add(keyboard,BorderLayout.CENTER);
BorderLayout
Strategy Pattern
• Pluggable strategy for layout management
• Layout manager object responsible for
executing concrete strategy
• Generalizes
G
li
tto Strategy
St t
Design
D i Pattern
P tt
• Other manifestation: Comparators
Comparator comp = new CountryComparatorByName();
Collections.sort(countries, comp);
Strategy Pattern
Context
• A class can benefit from different variants for an
algorithm
• Clients sometimes want to replace standard algorithms
with custom versions
Solution
• Define an interface type that is an abstraction for the
algorithm
• Actual strategy classes realize this interface type.
• Clients can supply strategy objects
• Whenever the algorithm needs to be executed, the
context class calls the appropriate methods of the
strategy object
5
Strategy Pattern
Strategy Pattern
Comparator
Collections
Compare()
anonymous
Strategy Pattern
LayoutManager
Container
layoutContainer()
QUIZ
Which versions of Graph
class use strategy pattern?
BorderLayout
Design patterns
•
•
•
•
Design Patterns
Iterator
Model-View-Controller and Observer
Strategy
• Composite
• Decorator
1. None
2. A
3. B
4. A,B
5.I don’t know
public class Graph {
private Function f = new Logarithm();
A
public draw()
{ plot(1,f.evaluate(1)); … }
}
public class Graph {
private Function f;
public Graph(Function fun) { f=fun; }
B
public draw()
{ plot(1,f.evaluate(1)); … }
}
Containers and Components
• Containers collect GUI components
• Sometimes, want to add a container to another container
• Container should be a Component
• Composite design pattern
• Composite method typically invoke component methods
• E.g. Container.getPreferredSize invokes
getPreferredSize of components
6
Composite Pattern
Composite Pattern
Context
• Primitive objects can be combined to composite objects
• Clients treat a composite object as a primitive object
Solution
• Define an interface type that is an abstraction for the primitive
objects
• Composite object collects primitive objects
• Composite and primitive classes implement same interface type.
• When implementing a method from the interface type, the composite
class applies the method to its primitive objects and combines the
results
Composite Pattern
Component
JButton
getPreferredSize()
JPanel
QUIZ
Does UML and code for
paint methods realize
composite design pattern?
1.Yes, both UML and code
2.Only UML
3.Only code
4.Neither UML nor code
5.I don’t know
Design patterns
•
•
•
•
•
Design Patterns
Iterator
Model-View-Controller and Observer
Strategy
Composite
• Decorator
class Rectangle:
public void paint(Graphics2D g) {
g.draw(. . .);
}
class Composite:
private ArrayList<Rectangle> cubes;
public void paint(Graphics2D g) {
for (Rectangle r: cubes)
r.paint(g);
}
Scroll Bars
• Scroll bars can be attached to components
• Approach #1: Component class can turn on scroll bars
• Approach #2: Scroll bars can surround component
JScrollPane pane = new JScrollPane(component);
• Swing uses approach #2
• JScrollPane is again a component
7
Decorator Pattern
Decorator Pattern
Context
• Component objects can be decorated (visually or behaviorally
enhanced)
• The decorated object can be used in the same way as the
undecorated object
• The component class does not want to take on the responsibility of
the decoration
open-ended
ended set of possible decorations
• There may be an open
Solution
• Define an interface type that is an abstraction for the component
• Concrete component classes realize this interface type.
• Decorator classes also realize this interface type.
• A decorator object manages the component object that it decorates
• When implementing a method from the component interface type,
the decorator class applies the method to the decorated component
and combines the result with the effect of the decoration.
Decorator Pattern
JComponent
JTextArea
paintComponent()
JScrollPane
QUIZ
Does UML and code for
paint methods realize
decorator design pattern?
1.Yes, both UML and code
2.Only UML
3.Only code
4.Neither UML nor code
5.I don’t know
class Rectangle:
public void paint(Graphics2D g) {
g.draw(. . .);
}
class Decor:
private Cubism cube;
public void paint(Graphics2D g) {
g.draw(new Rectangle2D(. . .));
g.draw(... cube ...);
}
8