Presentation is loading. Please wait.

Presentation is loading. Please wait.

Design Patterns: Design by Abstraction

Similar presentations


Presentation on theme: "Design Patterns: Design by Abstraction"— Presentation transcript:

1 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 Modeling the solar system
1..* 0..* Sun Planet Moon Q: How to make sure that there exists only one Sun object in the system?

4 In Java … public class Sun {
private static Sun theInstance = new Sun(); private Sun() { /* … */ } public static Sun getInstance() { return theInstance; } // the rest of code … Q1: Can the client create more than one Sun? Q2: Can the client access the unique Sun?

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 Responsibility Builder Bridge Command Factory Method Composite Interpreter Prototype Decorator Iterator Singleton Façade Mediator Flyweight Memento Proxy 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.

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 Approach
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
Sample code: any duplicate? class A { void m1() { // … step1(); step2(); step3(); } class B { void m2() { // … step1(); step2(); step3(); }

16 Refactored Code class C { void computeAll() { step1(); step2();
} class A extends C { void m1() { // … computeAll(); } class B extends C { void m2() {

17 Refactoring by Delegation
class Helper { void computeAll() { step1(); step2(); step3(); } class A { void m1() { // … h.computeAll(); } Helper h; class B { void m2() { Q. Compare the two?

18 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

19 Generic Animation Applet
Reusable class that supports the animation idiom Applet timer AnimationApplet {abstract} # delay: int # dim: Dimension + init() + start() + stop() Timer

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 Animation Applet
Reusable class that supports double-buffered animation Applet DBAnimationApplet {abstract} init() initAnimation() update() paint() paintFrame() {abstract} AnimationApplet {abstract} image Image offScreen Graphics

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 Constructors Question Why protected constructors?
protected DBAnimationApplet(boolean doubleBuffered) { this.doubleBuffered = doubleBuffered; } protected DBAnimationApplet() { this(true); Question Why protected constructors?

26 Initialization Questions Why “final” init?
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?

27 Updating and Painting Questions
final 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. Note that: init() calls initAnimation() which is overridden in the subclass, and Both update() and paint() call paintFrame() which is overridden in the subclass. DBAnimationApplet init() initAnimator() update() paint() paintFrame() BouncingBall

29 Bouncing Ball Animation
public 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

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 Applet Plotter func() paint() plotFunction() drawCoordinates() func() PlotSine func() PlotCosine func()

36 Exercise Complex numbers, x + y*i Rectangular Polar imaginary (x, y)
real imaginary Polar (r, a) r a

37 Exercise (Cont.) Complex add() mul() realPart() imaginaryPart()
magnitude() angle() RectangularComplex PolarComplex

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 Example
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 Applet Plotter func() paint() plotFunction() drawCoordinates() func() PlotSine func() PlotCosine func()

42 Generic Multiple Function Plotter
Applet 1..* Plotter func() paint() plotFunction() drawCoordinates() MultiPlotter initMultiPlotter() init() addFunction() plotFunction() func() Function apply() Sine apply() <<create>> PlotSineCosine initMultiPlotter() Cosine apply() <<create>>

43 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() Method to add a function to be plotted plotFunction() Auxiliary function called by paint() to plot the functions func() Method inherited from class Plotter that is no longer useful in this class

44 Strategy Design Pattern
Intent To define a family of algorithms, encapsulate each one, and make them interchangeable Context contextMethod() strategy ConcreteStrategyA algorithm() Strategy alogorithm() ConcreteStrategyB strategy.algorithm()

45 Question Have we used the Strategy Pattern before?

46 Abstract Coupling Definition Example Question
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
Accessing all elements of collection objects such as sets, bags, lists, etc. 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 …

49 <<create>>
Iterator Pattern Intent To provide a way to access the elements of a collection sequentially <<use>> Iterator hasNext() next() Collection iterator() ConcreteCollection iterator() ConcreteIterator hasNext() next() <<create>> return new ConcreteIterator()

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
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 Product Client AbstractFactory makeProduct() create ConcreteFactory makeProduct() ConcreteProuct

52 Example Complex numbers ComplexFactory makeComplext() Complex
<<create>> PolarFactory makeComplex() PolarComplex <<create>> RectangularFactory makeComplex() RectangularComplex


Download ppt "Design Patterns: Design by Abstraction"

Similar presentations


Ads by Google