1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design...
-
Upload
jalyn-render -
Category
Documents
-
view
224 -
download
0
Transcript of 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design...
![Page 1: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/1.jpg)
1
Object Oriented ProgrammingLecture XII
The Adapter,Template, Strategy and Factory design patterns
![Page 2: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/2.jpg)
2
Last Lecture
• More design by abstraction– Design patterns
• the Strategy pattern (again)– Making use of interfaces
• the Factory pattern– making use of abstract classes and inheritance
• the Adapter design pattern
– A concrete case study• An algorithm animator• Applying the Template, Strategy, Observer-Observable and the
Factory patterns
![Page 3: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/3.jpg)
3
Today’s Talk
• Concurrency by multithreading– Design patterns
• the Strategy pattern (again)– Making use of interfaces
• the Factory pattern– making use of abstract classes and inheritance
• the Adapter design pattern
– A concrete case study• An algorithm animator• Applying the Template, Strategy, Observer-Observable and
the Factory patterns
![Page 4: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/4.jpg)
4
Template Pattern
• Purpose: To implement a generic, reusable Class which:– encapsulates shared and necessary functionality
• i.e. concrete methods in Java– but also allowing specific methods to be user
specified (abstract in the template)• the abstract keyword enforce user definition of these
methods
• We have used the Template pattern in – the generic Doublebuffered Animation Applet– the generic Function Plotter
![Page 5: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/5.jpg)
5
Structure of the Template pattern
Abstract Class
Concrete implementations (invariant parts)
Abstract hook methods
Subclass extending the template (Concrete class)
Definition of the methods
Generic Class
templateMethod()
hookMethod1()
hookMethod2()
Concrete Class
hookMethod1()
hookMethod2()
![Page 6: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/6.jpg)
6
Strategy pattern
• Purpose: An abstraction for decoupling of algorithms from its context– to enforce provision of a set of required services
(methods) but using different algorithms• The abstract strategy specifies the contractual
interface• A concrete strategy must implement the
contractual interface, and provide the definition of a specific strategy
• A very useful method for dynamic coupling of different algorithms in a program
![Page 7: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/7.jpg)
7
Design Pattern: Strategy
The plotter The abstract strategy:
An Interface or Abstract Class
Concrete implementations
Context
ContextMethod()
Strategy
algorithm()
ConcreteStrategyA()
algorithm() algorithm()
ConcreteStrategyB()
![Page 8: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/8.jpg)
8
Animation of Sorting Algorithms
• Applet to visualize the execution of sorting algorithms
• Should be easy to adapt – for different sort algorithms– for different displays
• Demonstrates usage of– the Factory pattern,– the Strategy pattern– and the Observer -
Observable pattern
![Page 9: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/9.jpg)
9
A Framework for Sorting Algorithms
• Input to the Algorithm Sorter: – an array of integers (int[] arr)
• Ability to choose different sorting algorithms of different complexity– Bubble Sort complexity Ο(n2)– Quick Sort complexity O(n*log n)– Insertion Sort complexity O(n2)– ...
• The framework should also be adaptable to different display strategies– how we visualize the elements to be sorted
![Page 10: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/10.jpg)
10
Generic Algorithm Animation: Design Issues
• Algorithm abstraction?– Problem: How can we easily change between
different algorithms?
• Integration with animator?– Problem: The screen should be redrawn after each
iterative step, when running the algorithm
• Display abstractions?– Problem: We also need a methodolgy to be able
exchange different graphical displays
![Page 11: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/11.jpg)
11
First design of the Algorithm Animator
• Two design pattern candidates:– Template: Not flexible
enough since we want to dynamically assign any sorting algorithm (recall the function multiplotter from last lecture)
– Strategy: More flexible since we can decouple the sorting algorithms from the animator
• We will use the Strategy pattern to separate algorithms from animator
![Page 12: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/12.jpg)
12
Design Pattern: Strategy
Abstract strategy for sort algorithms
Concrete Sort algorithms
So we can render an image between each step in the sort process
Algorithm Animator
Sortalgorithm()
Strategy
sort()
BubbleSort
sort() sort()
QuickSort
![Page 13: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/13.jpg)
13
The Sorting Abstraction
• An abstract sort method (hook method)– called by the animator to start sorting
• How do we render each element swap during the sort?– We implement a pause() function!
• Pause the sorting and render the image after each swap during the sort process
• All sorting algorithms do swapping of two elements• Makes sense to put the swap in the sorting abstraction
• How do we order animator to render the image after each swap?– use a reference to Animator so we can call by
animator.pause();– or…we can use the Observer-Observable pattern!
![Page 14: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/14.jpg)
14
The sorting abstraction –applying template pattern
public abstract class SortAlgorithm extends java.util.Observable {
abstract void sort(int a[]); protected void pause(){
setChanged();notifyObservers();
} protected static void swap(int a[], int i, int j) {
int T;T = a[i]; a[i] = a[j]; a[j] = T;
}}
![Page 15: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/15.jpg)
15
A concrete sorting algorithm
class BubbleSortAlgorithm extends SortAlgorithm { public void sort(int a[]) { for (int i = a.length; --i >= 0; ) for (int j = 0; j < i; j++) { if (a[j] > a[j+1]) swap(a, j, j+1); pause(); } }}
![Page 16: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/16.jpg)
16
The algorithm animator
• The AlgorithmAnimator template– abstract method for initAnimator();
• A an applet– implements Runnable and Observer
• Performs animation of an abstract SortAlgorithm
• The animation is controlled by– a thread to handle frame delay– the Observer Observable pattern for abstract object
interaction
![Page 17: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/17.jpg)
17
The AlgorithmAnimatorpublic abstract class AlgorithmAnimator extends JApplet implements Runnable,Observer{ … protected SortAlgorithm theAlgorithm; protected int [] arr; … public void start(){
if(animationThread == null){ animationThread = new Thread(this); finished = false; animationThread.start();}
} public void stop(){
finished = true; } ….
![Page 18: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/18.jpg)
18
The AlgorithmAnimator … public void run(){
theAlgorithm.sort(arr); } final public void update(Observable obs, Object o) {
if (!finished) { try{
Thread.currentThread().sleep(delay); }catch(InterruptedException e) {} repaint();}
} public void setDelay(int d){
delay = d; }…
![Page 19: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/19.jpg)
19
The AlgorithmAnimator … public final void init() {
setDelay(20); scramble();initAnimator();theAlgorithm.addObserver(this);
} protected abstract void initAnimator(); protected void scramble() {
arr = new int[getSize().height / 2];for(int i = arr.length; --i >= 0;) arr[i] = i;for(int i = arr.length; --i >= 0;) { int j = (int)(i * Math.random()); SortAlgorithm.swap(arr, i, j); }
}…}
![Page 20: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/20.jpg)
20
A Bubble sorter using the AlgorithmAnimator
public class BubbleSorter
extends AlgorithmAnimator
{
protected void initAnimator(){
theAlgorithm = new BubbleSortAlgorithm();
}
}
![Page 21: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/21.jpg)
21
How can we improve the design?
• The different sort algorithms are strongly coupled to the specific Animator
• We want the sorting algorithms to easily be interchangable– deciding what algorithms at startup time
• We want the client (algorithm animator) to be ”unaware” of the concrete algorithms
![Page 22: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/22.jpg)
22
Improving our design using the Factory Design Pattern
• We can put the creation of algorithms in a separate class
• We call this class a Factory and it produces products (Sort Algorithms) of a certain type (Sorting Abstraction)
• The concrete algorithms will be coupled to the Algorithm Factory
![Page 23: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/23.jpg)
23
The Factory Design Pattern
Using Strategy to decouple the algorithms
The concrete Factory
Algorithm Animator
Sortalgorithm()
SortingAlgorithm
sort()
BubbleSort
sort() sort()
QuickSort
Algorithm Factory
makeSortAlgorithm()
StaticAlgoFactory
makeSortAlgorithm()
![Page 24: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/24.jpg)
24
The StaticAlgoFactory class
• Input: the name of a sorting algorithm (String)• Output: A concrete instance of the abstract
SortAlgorithm (a product)• The contractual interface for AlgoFactories:
– abstract SortAlgorithm makeSortAlgorithm(String algName){...}
– must be defined by every concrete AlgoFactory– binds the actual algorithm to the animator
![Page 25: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/25.jpg)
25
The Factory
public interface SortAlgorithmFactory{
SortAlgorithm makeSortAlgorithm(String name); }
Algorithm Animator
Sortalgorithm()
SortingAlgorithm
sort()
BubbleSort
sort() sort()
QuickSort
Algorithm Factory
makeSortAlgorithm()
StaticAlgoFactory
makeSortAlgorithm()
![Page 26: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/26.jpg)
26
A concrete Algorithm Factory
public class StaticAlgoFactoryimplements SortAlgorithmFactory {
public SortAlgorithm makeSortAlgorithm(String name) { if("BubbleSort".equals(name)) return new BubbleSortAlgorithm(); else if ("QuickSort".equals(name)) return new QuickSortAlgorithm(); else return new BubbleSortAlgorithm(); }}
![Page 27: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/27.jpg)
27
Using the improved AlgorithmAnimator
import java.awt.*;
public class Sort extends AlgorithmAnimator{protected void initAnimator(){
String algoName = getParameter("alg");SortAlgorithmFactory factory = new
StaticAlgoFactory();theAlgorithm =
factory.makeSortAlgorithm(algoName); }}
![Page 28: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/28.jpg)
28
Invoking the AlgorithmAnimation applet
<applet code=Sort.class width=100 height=100>
<param name = alg value = QuickSort>
</applet>
![Page 29: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/29.jpg)
29
Further improvement: Decoupling the SortDisplay• public int getArraySize()
– method to provide the arraysize so we know the maximum bars we can draw and animate using this display
• public void display(int[] a, Graphics g, Dimension d)– the abstract drawing method, to be called by paint
• To be implemented as exercise!
![Page 30: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/30.jpg)
30
New Design Pattern: Adapter
• A design pattern that can be used to:– reuse classes which can not be used directly without
some modification– narrow interfaces when just needing a small subset
of the methods
![Page 31: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/31.jpg)
31
Narrowing with an adapter
• Some classes have an implementation which do not ”fit” perfectly with the requirements
• ...or we might only need few of the availabe methods, from a class requiring a certain contractual interface to be defined– eg. when listening for mouse actions
![Page 32: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/32.jpg)
32
The MouseAdapter
• MouseAdapter is a class implementing the MouseListener interface– The adapter defines all MouseListener
methods empty (No action as default)– By extending the MouseAdapter, we only
need to override the methods we need from the mouse listener interface
![Page 33: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/33.jpg)
33
The MouseListener interface
void mouseClicked(MouseEvent e); Invoked when the mouse button has been clicked (pressed and released) on a component.
void mouseEntered(MouseEvent e); Invoked when the mouse enters a component.
void mouseExited(MouseEvent e); Invoked when the mouse exits a component.
void mousePressed(MouseEvent e); Invoked when a mouse button has been pressed on a component. void mouseReleased(MouseEvent e);
Invoked when a mouse button has been released on a component.
![Page 34: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/34.jpg)
34
The MouseAdapter implements MouseListenervoid mouseClicked(MouseEvent e){/* no action */}
Invoked when the mouse has been clicked on a component.
void mouseEntered(MouseEvent e) {/* no action */}Invoked when the mouse enters a component.
void mouseExited(MouseEvent e) {/* no action */}Invoked when the mouse exits a component.
void mousePressed(MouseEvent e) {/* no action */}Invoked when a mouse button has been pressed on a component.
void mouseReleased(MouseEvent e) {/* no action */}
Invoked when a mouse button has been released on a component.
![Page 35: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/35.jpg)
35
A Simple MouseClick listener
public MouseClick extends MouseAdapter{
void mouseClicked(MouseEvent e){
System.out.println(”Disco!”);
}
/**
* Other MouseListener methods can be omitted
**/
}
![Page 36: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/36.jpg)
36
Structure of the Adapter pattern: Class Adapter
Client Target
doStuff()
Adapter
doStuff()
Adaptee
doSomeTask()
doStuff(){….doSomeTask();…return result;
}
![Page 37: 1 Object Oriented Programming Lecture XII The Adapter,Template, Strategy and Factory design patterns.](https://reader036.fdocuments.in/reader036/viewer/2022062409/56649cae5503460f94970fb0/html5/thumbnails/37.jpg)
37
Structure of the Adapter pattern: Object Adapter
Client Target
doStuff()
Adapter
doStuff()
Adaptee
doSomeTask()
adaptee.doSomeTask();