Date post: | 17-Jan-2016 |
Category: |
Documents |
Upload: | derrick-fox |
View: | 214 times |
Download: | 1 times |
Design Patterns: Design by Abstraction
CS 3331
Chapter 7 of [Jia03]
2
Outline
Design pattern Reusable component Template method Strategy pattern Factory pattern
3
Motivation
Q: How to make sure that there exists only one Sun object in the system?
Modeling the solar system
1..*Planet MoonSun
0..*
4
In Java …
public class Sun { private static Sun theInstance = new Sun(); private Sun() { /* … */ } public static Sun getInstance() { return theInstance; } // the rest of code …}
5
In General …
T
- theInstance: T { static }
- T()+ getInstance(): T { static }
return theInstance;
6
Singleton Design Pattern
Intent To ensure that a class has only one instance and
provides a global access point to it
Applicability Use the Singleton pattern when there must be exactly
one instance of a class and it must be accessible to clients from a well-known access point
Benefits Controlled access to the sole instance Permits a variable number of instances
7
Example Define a Calendar class using the Singleton pattern.
public class Calendar {
// the rest of code …}
8
What Are Design Patterns?
Design patterns are: Schematic descriptions of design solutions to
recurring problems in software design, and Reusable (i.e., generic), but don’t have to be
implemented in the same way. That is, describe:
Design problems that occur repeatedly, and Core solutions to those problems.
9
Why Design Patterns?
To capture and document software design knowledge.
=> helps designers acquire design expertise. To support reuse in design and boost
confidence in software systems. To provide a common vocabulary for software
designers to communicate their designs.
10
GoF Patterns
Creational Structural Behavioral
Abstract Factory Adapter Chain of ResponsibilityBuilder Bridge CommandFactory Method Composite InterpreterPrototype Decorator IteratorSingleton Façade Mediator
Flyweight MementoProxy Observer
StateStrategyTemplate MethodVisitor
E. Gamma, R. Helm, R. Johnson, and J. Vlissides. Design Patterns, Elements of ReusableObject-Oriented Software, Addison-Wesley, 1995.
11
Outline
Design pattern Reusable component Template method Strategy pattern Factory pattern
12
Generic (Reusable) Components Generic components
Program components (e.g., classes and packages) that can be extended, adapted, and reused in many different contexts without having to modify the source code
Also known as reusable components Techniques for designing generic components
Refactoring Generalizing
13
Refactoring Definition
Refactoring means restructuring a program to improve its structure (e.g., to eliminate duplicate code segments) without changing its functionality
Approach Identify code segment that implements the same logic
(e.g., duplicate code)=> Commonality and variability analysis
Capture the logic in a generic component Restructure by replacing every occurrence of the code
segment with a reference to the generic component
14
Refactoring Duplication Why?
Hazardous for maintenance Changes must be repeated everywhere Some may be overlooked or forgotten Thus, code segments can easily drift apart
Approach Refactoring by inheritance Refactoring by delegation
15
Refactoring by Inheritance
class A { void m1() { // … step1(); step2(); step3(); // … } // …}
class B { void m2() { // … step1(); step2(); step3(); // … } // …}
Sample code: any duplicate?
16
Refactored Code
class C { void computeAll() { step1(); step2(); step3(); }}
class A extends C { void m1() { // … computeAll(); // … } // …}
class B extends C { void m2() { // … computeAll(); // … } // …}
17
Refactoring by Delegation
class Helper { void computeAll() { step1(); step2(); step3(); }}
class A { void m1() { // … h.computeAll(); // … } Helper h;}
class B { void m2() { // … h.computeAll(); // … } Helper h;}
Q. Compare the two?
18
Exercise
public class Point { public Point(int x, int y) { this.x = x; this.y = y; } protected int x, y; // other code;}
public class ColoredPoint extends Point { public ColoredPoint(int x, int y, Color c) { this.x = x; this.y = y; this.c = c; } protected Color c; // other code}
Identify and remove duplicate code.
19
Generic Animation Applet
Reusable class that supports the animation idiom
Applet
AnimationApplet {abstract}
# delay: int# dim: Dimension
+ init()+ start()+ stop()
Timertimer
20
Animation Applet (Cont.)public abstract class AnimationApplet extends java.applet.Applet {
protected Timer timer; protected int delay = 100; protected Dimension dim;
public void init() { dim = getSize(); String att = getParameter(“delay”); if (att != null ) { delay = Integer.parseInt(att); } timer = new Timer(delay, e -> repaint()); }
<<continue to the next page>>
21
Animation Applet (Cont.) public void start() { timer.start(); }
public void stop() { timer.stop(); }}
22
Using Animation Applet
Reimplement the DigitalClock applet to use the animation applet class.
DigitalClock
init()start()stop()paint()
DigitalClock
paint()
AnimationApplet
23
Generic Double-Buffered AnimationApplet
Reusable class that supports double-buffered animation
Applet
DBAnimationApplet {abstract}
init()initAnimation()update()paint()paintFrame() {abstract}
AnimationApplet{abstract}
Image
Graphics
image
offScreen
24
DB Animation Applet (Cont.)public abstract class DBAnimationApplet extends AnimationApplet { protected Image image; protected Graphics offscreen; protected boolean doubleBuffered;
<<constructors>> <<initialization>> <<updating and painting>>
}
25
Constructorsprotected DBAnimationApplet(boolean doubleBuffered) { this.doubleBuffered = doubleBuffered;}
protected DBAnimationApplet() { this(true);}
Question Why protected constructors?
26
Initializationfinal public void init() { super.init(); image = createImage(dim.width, dim.height); offscreen = image.getGraphics(); initAnimator();}
protected void initAnimator() {}
Questions Why “final” init? Why “protected” and separate initAnimator? What’s the difference between constructors and
init methods?
27
Updating and Paintingfinal public void update(Graphics g) { if (doubleBuffered) { paintFrame(offscreen); g.drawImage(image, 0, 0, this); } else { paintFrame(g); }}final public void paint(Graphics g) { update(g);}protected abstract void paintFrame(Graphics g);
Questions Why “final” update and paint, and why “abstract” paintFrame? How does this cater for both double-buffered and non-DB
animation?
28
Example
Rewrite the bouncing ball applet to use the DBAnimationApplet class.
DBAnimationApplet
init()initAnimator()update()paint()paintFrame()
BouncingBall
initAnimator()paintFrame()
Note that:- init() calls initAnimation() which is overridden in the subclass, and- Both update() and paint() call paintFrame() which is overridden in the subclass.
29
Bouncing Ball Animationpublic class BouncingBall extends DBAnimationApplet {
private int x, y; private int dx = -2, dy = -4; private int radius = 20; private Color color = Color.GREEN;
protected void initAnimator() { x = dim.width * 2 / 3; y = dim.height - radius; }
<< paintFrame method >>}
30
Bouncing Ball Animation (Cont.) protected void paintFrame(Graphics g) { g.setColor(Color.BLACK); g.fillRect(0, 0, dim.width, dim.height);
if (x < radius || x > dim.width - radius) { dx = -dx; } if (y < radius || y > dim.height - radius) { dy = -dy; }
x += dx; y += dy;
g.setColor(color); g.fillOval(x - radius, y - radius, radius * 2, radius * 2); }
31
Template Methods
Intent To define a skeleton algorithm by deferring some
steps to subclasses To allow the subclasses to redefine certain steps
AbstractClass
templateMethod()hookMethod1()hookMethod2()
ConcreteClass
hookMethod1()hookMethod2()
…hookMethod1()…hookMethod2()…
32
Template Methods (Cont.)
Terminology Hook methods: placeholders for the behaviour
to be implemented by subclasses Template methods: methods containing hook
methods Hot spots: changeable behaviours of generic
classes represented by hook methods Frozen spots: fixed behaviours of generic
classes represented by template methods
33
Exercise
Identify hook methods and template methods in the DBAnimationApplet class.
34
Exercise: Solar System
Write an animation applet that shows the sun and a planet orbiting around the sun. Use the DBAnimationApplet class.
35
More Example Generic function plotter
To plot arbitrary single-variable functions on a two-dimensional space
Plotter
func()paint()plotFunction()drawCoordinates()
PlotSine
func()
…func()…
Applet
PlotCosine
func()
36
Exercise
(r, a)
r
a
Polar
(x, y)
x
y
Rectangular
real
imaginary
Complex numbers, x + y*i
37
Exercise (Cont.)
Complex
add()mul()realPart()imaginaryPart()magnitude()angle()
RectangularComplex
realPart()imaginaryPart()magnitude()angle()
PolarComplex
realPart()imaginaryPart()magnitude()angle()
38
Exercise (Cont.)Write the template methods add and mul.
// Assume constructors RectangularComplex(int real, int imag) and // PolarComplex(int magnitude, int angle).public Complex add(Complex c) {
}
public Complex mul(Complex c) {
}
39
Outline
Design pattern Reusable component Template method Strategy pattern Factory pattern
40
Generalization
Definition Process that takes a solution to a specific
problem and restructures it to solve a category of problems similar to the original problem
Example Generalize the plotter class to support multiple
functions
41
Review Generic function plotter
To plot arbitrary single-variable functions on a two-dimensional space
Plotter
func()paint()plotFunction()drawCoordinates()
PlotSine
func()
…func()…
Applet
PlotCosine
func()
42
Generic Multiple Function Plotter
Plotter
func()paint()plotFunction()drawCoordinates()
Sine
apply()
Applet
MultiPlotter
initMultiPlotter()init()addFunction()plotFunction()func()
PlotSineCosine
initMultiPlotter()
Cosine
apply()
Function
apply()
1..*
<<create>>
<<create>>
43
Multiple Function Plotter (Cont.)
Method Description
initMultiPlotter() Hook method for subclasses to set upfunctions to be plotted
init() Template method for initializationwhich calls initMultiPlotter()
addFunction() Method to add a function to be plottedplotFunction() Auxiliary function called by paint()
to plot the functions
func() Method inherited from class Plotterthat is no longer useful in this class
44
Strategy Design Pattern
Context
contextMethod()
strategy
ConcreteStrategyA
algorithm()
Strategy
alogorithm()
ConcreteStrategyB
algorithm()
Intent To define a family of algorithms, encapsulate
each one, and make them interchangeable
strategy.algorithm()
45
Question
Have we used the Strategy Pattern before?
46
Abstract Coupling Definition
Abstract coupling means a client access a service through an interface or an abstract class without knowing the actual concrete class that provide the service
Example Strategy pattern Iterator pattern
Question Why abstract coupling?
47
Design Guideline
Program to an interface, not to an implementation!
48
Iterating over Collection
Collection<T> c;…c= new ArrayList<>();…for (Iterator<T> i = c.iterator(); i.hasNext(); ) { T elem = i.next(); …}
// since Java 5 if c is of type Iterable<T>for (T elem: c) { … elem …}
Accessing all elements of collection objects such as sets, bags, lists, etc.
49
Iterator Pattern
Collection
iterator()
Iterator
hasNext()next()
ConcreteCollection
iterator()
ConcreteIterator
hasNext()next()
<<create>>
return new ConcreteIterator()
Intent To provide a way to access the elements of a
collection sequentially
<<use>>
50
Exercise Fill out the missing part to implement the Iterator interface
public class Library { private Book[] books; /** Returns an iterator enumerating all books of this library. */ public Iterator<Book> books() { return new LibraryIterator(books); }
private static class LibraryIterator implements java.util.Iterator<Book> { public void remove() { throw new UnsupportedOperationException(); } // YOUR CODE HERE …
}}
51
Factory Design Pattern
AbstractFactory
makeProduct()
Product
ConcreteFactory
makeProduct()
ConcreteProuctcreate
Client
Intent To decouple object creation from its use and to
support different way of creating objects To define an interface for creating objects but let
subclasses decide which class to instantiate and how
52
Example Complex numbers
ComplexFactory
makeComplext() Complex
PolarFactory
makeComplex()
<<create>>RectangularFactory
makeComplex()
PolarComplex
RectangularComplex
<<create>>