39
Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Embed Size (px)

Citation preview

Page 1: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Object-Oriented

Design Patterns

CSC 335: Object-Oriented Programming and Design

Page 2: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Outline

Overview of PatternsIteratorStrategy

Page 3: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

The BeginningChristopher Alexander, architect– A Pattern Language--Towns, Buildings, Construction– Timeless Way of Building (1979)– “Each pattern describes a problem which occurs over and over

again in our environment, and then describes the core of the solution to that problem, in such a way that you can use this solution a million times over, without ever doing it the same way twice.”

Other patterns: novels (tragic, romantic, crime), movies genres,

Page 4: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

“Gang of Four” (GoF) Book

Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley Publishing Company, 1994.Written by this "gang of four"– Dr. Erich Gamma, then Software Engineer, Taligent, Inc.; – Dr. Richard Helm, then Senior Technology Consultant, DMR Group; – Dr. Ralph Johnson, then and now at University of Illinois, Computer

Science Department– Dr. John Vlissides, then a researcher at IBM Thomas J. Watson

Research Center. See WikiWiki tribute page http://c2.com/cgi/wiki?JohnVlissides

Page 5: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

PatternsThis book defined 23 patterns in three categories.– Creational patterns deal with the process of object creation– Structural patterns, deal primarily with the static composition and

structure of classes and objects– Behavioral patterns, which deal primarily with dynamic interaction

among classes and objects

Many other patterns have been introduced by others.– For example, the book Data Access Patterns by Clifton Nock

introduces 4 decoupling patterns, 5 resource patterns, 5 I/O patterns, 7 cache patterns, and 4 concurrency patterns.

– Other pattern languages include telecommunications patterns, pedagogical patterns, analysis patterns

– Patterns are mined at places like Patterns Conferences

Page 6: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

GoF Patterns

– Creational Patterns• Abstract Factory • Builder • Factory Method • Prototype • Singleton

– Structural Patterns• Adapter • Bridge• Composite • Decorator • Façade• Flyweight • Proxy

– Behavioral Patterns• Chain of Responsibility• Command • Interpreter• Iterator • Mediator• Memento• Observer • State• Strategy • Template Method • Visitor

Page 7: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Why Study Patterns?

Can reuse solutions.– Gives us a head start– Avoids the gotchas later (unanticipated things)– No need to reinvent the wheel

Establish common terminology– Design patterns provide a common point of reference– Easier to say, “We need Strategy here.”

Provide a higher level prospective– Frees us from dealing with the details too early

Page 8: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Carpenter's ConversationAdapted from Ralph Johnson

How should we build the cabinet drawers?Cut straight down into the wood, cut back up 45 degrees a specific length, then go straight back down a specific length, the cut back up at 45 degrees .....

Page 9: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

A Higher Level Discussion

A high level discussion could have been: – "Should we use a miter joint or a dovetail joint?"– This is a higher, more abstract level– Avoids getting bogged down in details

Which level of detail is more efficient?

Page 10: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Consequences of which joint

Dovetail joints – are more complex, more expensive to make– withstands climate conditions – dovetail joint remains

solid as wood contracts and expands– independent of fastening system– more pleasing to look at

Thoughts underneath this question are– Should we make a beautiful durable joint or a cheap and

dirty one that lasts until the check clears?

Page 11: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Consequences

Carpenters, patterns writers, and software developers discuss consequences– consequences simply refer to cause and effect

• If we do this, what will happen – both good and bad– also known as the forces that patterns consider

• Example: If we use Mediator to add and drop courses– Add an extra class that needs reference to several objects– All of the logic and process is confined to one class so any change to

the "rules" would be handled there– Reduces dependencies between others objects (simpler design when

student does NOT tell the scheduled course to change)

Page 12: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Other advantages

Most design patterns make software more modifiable, less brittle– we are using time tested solutions

Using design patterns makes software systems easier to changeHelps increase the understanding of basic object-oriented design principles– encapsulation, inheritance, interfaces, polymorphism

Page 13: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Style for Describing Patterns

We will use this structure in these slides.– Pattern name– Recurring problem: what problem the pattern

addresses– Solution: the general approach of the pattern– UML for the pattern

• Participants: a description of the classes in the UML– Use Example(s): examples of this pattern, in Java

Page 14: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

A few Patterns

The next slides present two patterns– Iterator Design Pattern

• You have seen this and probably used it– Strategy

• Design Pattern that you have used with Layout managers

Page 15: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Pattern: Iterator

Name: Iterator (a.k.a Enumeration)Problem: How can you loop over all objects in any collection. You don’t want to change client code when the collection changes. You also want the same interface (methods)Solutions: 1) Have each class implement an interface. 2) Have an interface that works with all collectionsConsequences: Can change collection class details without changing code to traverse the collection

Page 16: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

GoF Version of Iterator page 257

ListIterator

First()

Next()

IsDone()

CurrentItem()

// Imaginary code

ListIterator<Employee> itr = list.iterator();

for(itr.First(); !itr.IsDone(); itr.Next()) {

cout << itr.CurrentItem().toString();

Page 17: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Java version of Iterator

interface Iteratorboolean hasNext()

Returns true if the iteration has more elements.

Object next() Returns the next element in the iteration

void remove() Removes the most recently visited element

Page 18: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

The Iterator interface in use

// The Client code// The Client code

List<BankAccount> bank = new List<BankAccount> bank = new ArrayListArrayList<BankAccount>(); <BankAccount>();

bank.add(new BankAccount("One", 0.01) );bank.add(new BankAccount("One", 0.01) );

// ...// ...

bank.add(new BankAccount("Nine thousand", 9000.00));bank.add(new BankAccount("Nine thousand", 9000.00));

String ID = "Two";String ID = "Two";

IteratorIterator<BankAccount><BankAccount> i i = bank. = bank.iterator();iterator();

while(while(i.hasNext()i.hasNext()) {) {

if(i.if(i.next()next().getID().equals(searchAcct.getID())).getID().equals(searchAcct.getID()))

System.out.println("Found " + ref.getID());System.out.println("Found " + ref.getID());

} }

Page 19: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

UML Diagram of Java's Iterator and Collections

<<interface>>Iterator

hasNext()next()

<<interface>>List

iterator() …

Context

Vector

iterator()Iterator

hasNext()next()

LinkedList

iterator()

ArrayList

iterator()

Page 20: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

importimport java.util.*; java.util.*;

publicpublic classclass IterateOverList { IterateOverList {

publicpublic staticstatic voidvoid main(String[] args) { main(String[] args) {

// Change ArrayList to LinkedList// Change ArrayList to LinkedList

List<String> names = List<String> names = newnew ArrayList<String>(); ArrayList<String>();

names.add(names.add("Chris""Chris"););

names.add(names.add("Casey""Casey"););

names.add(names.add("Kim""Kim"););

Iterator<String> itr = names.iterator();Iterator<String> itr = names.iterator();

whilewhile (itr.hasNext()) (itr.hasNext())

System.System.outout.println(itr.next());.println(itr.next());

}}

}}

Page 21: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Composite Design Pattern

Strategy

Page 22: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Pattern: Strategy

Name: Strategy (a.k.a Policy)Problem: You want to encapsulate a family of algorithms and make them interchangeable. Strategy lets the the algorithm vary independently from the clients that use it (GoF)

Solution: Create an abstract strategy class (or interface) and extend (or implement) it in numerous ways. Each subclass defines the same method names in different ways

Page 23: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Design Pattern: Strategy

Consequences: – Allows families of algorithms.

Known uses:– Layout managers in Java– Different Poker Strategies in 335 Project– Different PacMan chase strategies in 335 Project– TextField validators in dBase and Borland OWL:

• Will use different algorithms to verify if the user input is a valid integer, double, string, date, yes/no.

• Eliminates conditional statements

Page 24: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Java Example of Strategy

this.setLayout(new FlowLayout());this.setLayout(new FlowLayout()); this.setLayout(new GridLayout());this.setLayout(new GridLayout());

In Java, a container HAS-A layout manager– There is a default– You can change a container's layout manager with

a setLayout message

Page 25: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Change the stategy at runtime

Demonstrate LayoutControllerFrame.javaprivate class FlowListener

implements ActionListener { // There is another ActionListener for GridLayout public void actionPerformed(ActionEvent evt) { // Change the layout strategy of the JPanel // and tell it to lay itself out centerPanel.setLayout(new FlowLayout()); centerPanel.validate(); } }

Page 26: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

interface LayoutManager

– Java has interface java.awt.LayoutManager– Known Implementing Classes

• GridLayout, FlowLayout, ScrollPaneLayout – Each class implements the following methods addLayoutComponent(String name, Component comp) addLayoutComponent(String name, Component comp)

layoutContainer(Container parent) layoutContainer(Container parent)

minimumLayoutSize(Container parent) minimumLayoutSize(Container parent)

preferredLayoutSize(Container parent) preferredLayoutSize(Container parent)

removeLayoutComponent(Component comp) removeLayoutComponent(Component comp)

Page 27: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

UML Diagram of StrategyGeneral Form

Context

strategy: Strategy

ContextInterface …

<<interface>>

Strategy

AlgorithmInterface

ConcreteClassAAlgorithmInterface

ConcreteClassB AlgorithmInterface

ConcreteClassCAlgorithmInterface

implements

Page 28: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Specific UML Diagram of LayoutManager in Java

JPanel

layoutMan: LayoutManager

size: Dimension

setLayout(lm: LayoutManager)

setPreferredSize(di:Dimension)

<<interface>>LayoutManager

addLayoutComponent()layoutContainer()

minimumLayoutSize()

GridLayoutaddLayoutComponent()

layoutContainer()minimumLayoutSize()

FlowLayoutaddLayoutComponent()

layoutContainer()minimumLayoutSize()

ScrollPaneLayoutaddLayoutComponent()

layoutContainer()minimumLayoutSize()

implements

Page 29: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Model View Controller

Rick Mercer

Page 30: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Outline

Model View Controller – Observer as part of MVC– An example of the Observer Design Pattern

Page 31: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Model View Controller (MVC)

The intent of MVC is to keep neatly separate objects into one of tree categories– Model

• The data, the business logic, rules, strategies, and so on

– View• Displays the model and usually has components that allows user to

edit change the model

– Controller• Allows data to flow between the view and the model • The controller mediates between the view and model

Page 32: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Model

The Model's responsibilities– Provide access to the state of the system– Provide access to the system's functionality– Can notify the view(s) that its state has changed

Page 33: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

View

The view's responsibilities– Display the state of the model to the user

At some point, the model (a.k.a. the observable) must registers the views (a.k.a. observers) so the model can notify the observers that its state has changed

Page 34: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Controller

The controller's responsibilities– Accept user input

• Button clicks, key presses, mouse movements, slider bar changes

– Send messages to the model, which may in turn notify it observers

– Send appropriate messages to the view

In Java, listeners are controllers

Page 35: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

MVC Misunderstood

MVC is understood by different people in different waysIt is often misunderstood, but most software developers will say it is important; powerfulLets start it right: MVC is a few patterns put togetherConsider the Observer Pattern

Page 36: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Compound Patterns

The observer pattern is part of MVCIn Java, you can use Observer support– The model extends Observable– view implements Observer (one method update)– You need to addObservers to the model– The model sends these two messages whenever it thinks

the view should be updated setChanged();

notifyObservers();

Page 37: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Model

/** * A simple model that changes its color randomly when asked */import java.awt.Color;import java.util.Observable;import java.util.Random;

public class Model extends Observable { private Color currentColor; private static Random generator; // Or set up any color

public Model() { generator = new Random(); currentColor = Color.PINK; }

public void changeColor() { // Make the colors change seemingly randomly int red = (currentColor.getRed() + generator.nextInt(256)) % 256; int green = (currentColor.getGreen() + generator.nextInt(256)) % 256; int blue = (currentColor.getRed() + generator.nextInt(256)) % 256; currentColor = new Color(red, green, blue); // 1. These two messages are needed to send the // update message to any and all observers setChanged(); notifyObservers(); }

public Color getCurrentColor() { return currentColor; }}

Page 38: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

One Observer

/** * This observer prints the current color of the model to the * console An Observer will be sending update messages to this * JPanel after this JPanel has been added as an Observer */import java.awt.Color;import java.util.Observable;import java.util.Observer;

public class ObserverThatPrints implements Observer {

public void update(Observable observable, Object arg) { Color color = ((Model) observable).getCurrentColor(); System.out.println("update called, color = " + color); }}

Page 39: Object-Oriented Design Patterns CSC 335: Object-Oriented Programming and Design

Another Observer

Write another Observer as a JPanel that shows the color.toString() in a JLabel

- name it ObserverPanelWithLabel

Get a Controller from the Code Demos Page