Software Engineering Requirements Engineering

Download Report

Transcript Software Engineering Requirements Engineering

Design Patterns:
Design by Abstraction
CS 3331
Fall 2009
1
Outline





Design pattern
Reusable component
Template method
Strategy pattern
Factory pattern
2
Motivation
Modeling the solar system
1..*
Sun
0..*
Planet
Moon
Q: How to make sure that there exists only one
Sun object in the system?
3
In Java …
public class Sun {
private static Sun theInstance = new Sun();
private Sun() { /* … */ }
public static Sun getInstance() {
return theInstance;
}
// the rest of code …
}
4
In General …
T
- theInstance: T { static }
- T()
+ getInstance(): T { static }
return theInstance;
5
Singleton Design Pattern

Intent


Applicability


To ensure that a class has only one instance and
provides a global access point to it
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
6
Example

Define a Calendar class using the Singleton pattern.
public class Calendar {
// the rest of code …
}
7
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.
8
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.
9
GoF Patterns
Creational
Structural
Behavioral
Abstract Factory
Builder
Factory Method
Prototype
Singleton
Adapter
Bridge
Composite
Decorator
Façade
Flyweight
Proxy
Chain of Responsibility
Command
Interpreter
Iterator
Mediator
Memento
Observer
State
Strategy
Template Method
Visitor
E. Gamma, R. Helm, R. Johnson, and J. Vlissides. Design Patterns, Elements of Reusable
Object-Oriented Software, Addison-Wesley, 1995.
10
Outline





Design pattern
Reusable component
Template method
Strategy pattern
Factory pattern
11
Generic 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 of designing generic components


Refactoring
Generalizing
12
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)
Capture the logic in a generic component
Restructure by replacing every occurrence of the code
segment with a reference to the generic component
13
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
14
Refactoring by Inheritance
Sample code: any duplicate?
class A {
void m1() {
// …
step1();
step2();
step3();
// …
}
// …
}
class B {
void m2() {
// …
step1();
step2();
step3();
// …
}
// …
}
15
Refactored Code
class C {
void computeAll() {
step1();
step2();
step3();
}
}
class A extends C {
void m1() {
// …
computeAll();
// …
}
// …
}
class B extends C {
void m2() {
// …
computeAll();
// …
}
// …
}
16
Refactoring by Delegation
class Helper {
void computeAll() {
step1();
step2();
step3();
}
}
class A {
void m1() {
// …
h.computeAll();
// …
}
Helper h;
}
Q. Compare two approaches of
refactoring.
class B {
void m2() {
// …
h.computeAll();
// …
}
Helper h;
}
17
Exercise
Identify and remove duplicate code.
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
}
18
Generic Animation Applet

Reusable class that supports the animation idiom
Applet
timer
AnimationApplet
{abstract}
Timer
# delay: int
# dim: Dimension
+ init()
+ start()
+ stop()
19
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, new ActionListener() {
public void actionPerformed(ActionEvent event) {
repaint();
}
});
}
<<continue to the next page>>
20
Animation Applet (Cont.)
public void start() {
timer.start();
}
public void stop() {
timer.stop();
}
}
21
Using Animation Applet

Reimplement the DigitalClock applet
to use the animation applet class.
DigitalClock
init()
start()
stop()
paint()
AnimationApplet
DigitalClock
paint()
22
Generic Double-Buffered Animation
Applet

Reusable class that supports double-buffered
animation
Applet
DBAnimationApplet
{abstract}
init()
image
initAnimation()
update()
paint()
offScreen
paintFrame() {abstract}
AnimationApplet
{abstract}
Image
Graphics
23
DB Animation Applet (Cont.)
public abstract class DBAnimationApplet extends AnimationApplet {
<<constructors>>
<<initialization>>
<<updating and painting>>
protected Image image;
protected Graphics offscreen;
protected boolean doubleBuffered;
}
24
Constructors
protected DBAnimationApplet(boolean doubleBuffered) {
this.doubleBuffered = doubleBuffered;
}
protected DBAnimationApplet() {
this(true);
}

Question

Why protected constructors?
25
Initialization
final 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?
26
Updating and Painting
final public void update(Graphics g) {
if (doubleBuffered) {
paintFrame(offscreen);
g.drawImage(image, 0, 0, this);
} else {
super.update(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?
27
Example

Rewrite the bouncing ball applet to use the
DBAnimationApplet class.
DBAnimationApplet
init()
initAnimator()
update()
paint()
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.
BouncingBall
initAnimator()
paintFrame()
28
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()
…
hookMethod1()
…
hookMethod2()
…
ConcreteClass
hookMethod1()
hookMethod2()
29
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
30
Exercise

Identify hook methods and template
methods in the DBAnimationApplet class.
31
More Example

Generic function plotter

To plot arbitrary single-variable functions on a
two-dimensional space
Plotter
Applet
func()
paint()
plotFunction()
drawCoordinates()
PlotSine
func()
…
func()
…
PlotCosine
func()
32
Exercise
Complex numbers, x + y*i
Rectangular
Polar
imaginary
(x, y)
(r, a)
y
a
x
real
33
Exercise (Cont.)
Complex
add()
mul()
realPart()
imaginaryPart()
magnitude()
angle()
RectangularComplex
realPart()
imaginaryPart()
magnitude()
angle()
PolarComplex
realPart()
imaginaryPart()
magnitude()
angle()
34
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) {
}
35
Outline





Design pattern
Reusable component
Template method
Strategy pattern
Factory pattern
36
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
37
Review

Generic function plotter

To plot arbitrary single-variable functions on a
two-dimensional space
Plotter
Applet
func()
paint()
plotFunction()
drawCoordinates()
PlotSine
func()
…
func()
…
PlotCosine
func()
38
Generic Multiple Function
Plotter
Applet
Plotter
func()
paint()
plotFunction()
drawCoordinates()
1..*
MultiPlotter
Function
apply()
initMultiPlotter()
init()
addFunction()
plotFunction()
func()
Sine
PlotSineCosine
initMultiPlotter()
<<create>>
apply()
<<create>>
Cosine
apply()
39
Multiple Function Plotter (Cont.)
Method
Description
initMultiPlotter()
Hook method for subclasses to set up
functions to be plotted
init()
Template method for initialization
which calls initMultiPlotter()
addFunction()
plotFunction()
Method to add a function to be plotted
Auxiliary function called by paint()
to plot the functions
func()
Method inherited from class Plotter
that is no longer useful in this class
40
Strategy Design Pattern

Intent

To define a family of algorithms, encapsulate
each one, and make them interchangeable
strategy
Strategy
Context
alogorithm()
contextMethod()
strategy.algorithm()
ConcreteStrategyA
ConcreteStrategyB
algorithm()
algorithm()
41
Question

Have we used the Strategy Pattern
before?
42
Abstract Coupling

Definition


Example



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
Strategy pattern
Iterator pattern
Question

Why abstract coupling?
43
Design Guideline

Program to an interface, not to an
implementation!
44
Iterating over Collection

Accessing all elements of collection objects
such as sets, bags, lists, etc.
Collection c;
…
c = new ArrayList();
…
for (Iterator i = c.iterator(); i.hasNext(); ) {
Object elem = i.next();
…
}
45
Iterator Pattern

Intent

To provide a way to access the elements of a
collection sequentially
Iterator
Collection
iterator()
hasNext()
next()
ConcreteCollection
ConcreteIterator
iterator()
<<create>>
hasNext()
next()
return new ConcreteIterator()
46
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 books() { return new LibraryIterator(books); }
private static class LibraryIterator implements java.util.Iterator {
public void remove() { throw new UnsupportedOperationException(); }
// YOUR CODE HERE …
}
}
47
Factory Design Pattern

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
Client
Product
AbstractFactory
makeProduct()
create
ConcreteFactory
ConcreteProuct
makeProduct()
48
Example

Complex numbers
ComplexFactory
makeComplext()
Complex
<<create>>
PolarFactory
PolarComplex
makeComplex()
RectangularFactory
<<create>>
RectangularComplex
makeComplex()
49