cs427a: object-oriented programming - yale...

47
CS427a: Object-Oriented Programming Design Patterns for Flexible and Reusable design Michael J. Fischer (from slides by Y. Richard Yang) Lecture 23b November 29, 2011

Upload: others

Post on 22-Aug-2020

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

CS427a: Object-Oriented Programming Design Patterns for Flexible and Reusable design

Michael J. Fischer(from slides by Y. Richard Yang)

Lecture 23bNovember 29, 2011

Page 2: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Example: Duck Game

• A startup produces a duck-pond simulation game

• The game shows a large variety of duck species swimming and making quacking sounds

Page 3: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Initial Design

MillardDuck

display() { looks like a mallard}

RedheadDuck

display() { looks like a redhat}

Other types of ducks

Duck

quack()swim()display() = 0// Other duck-like method

Page 4: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Design Change: add fly()Duck

quack()swim()display() = 0fly()// Other duck-like method

MillardDuck

display() { looks like a mallard}

RedheadDuck

display() { looks like a redhat}

Other types of ducks

Page 5: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Problem• Generalization may lead to

unintended behaviors: a rubber duck is flying and quacks

Duck

quack()swim()display() = 0// Other duck-like method

RubberDuck

display() {looks like a rubber duck}quack() { // sqeak }fly() { // cannot fly }

MillardDuck

display() { looks like a mallard}

Page 6: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Anticipating Changes

• Identify the aspects of your application that may vary– What may change?

• Anticipate that – new types of ducks may appear and – behaviors (quack, swimming, and flying) may

change, even change at run time (swirl flying, circular flying, …)

Page 7: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Handling Varying Behaviors• Solution: take what varies and “encapsulate”

it– Since fly() and quack() vary across ducks, separate

these behaviors from the Duck class and create a new set of classes to represent each behavior

super class of all ducksVarying and run-time changeable behaviors

Page 8: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Design

• Each duck object has a fly behavior

FlyWithWings

fly() { //}

FlyNoWay

fly() { // cannot fly}

<<interface>>FlyBehavior

fly()

Page 9: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Programming to implementation vs. interface/supertype

• Programming to an implementation– Dog d = new Dog();– d.bark();

• Programming to an interface/supertype– Animal a = new Dog();– a.makeSound();

Page 10: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Implementation

FlyWithWings

fly() { //}

FlyNoWay

fly() { // cannot fly}

<<interface>>FlyBehavior

fly()

MallardDuck

display() { looks like a mallard}

RedheadDuck

display() { looks like a redhat}

Duck

quack()swim()display() = 0// Other duck-like method

Page 11: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Exercise

• Add rocket-powered flying?

Page 12: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

The Strategy Pattern

• Defines a set of algorithms, encapsulates each one, and makes them interchangeable by defining a common interface

Page 13: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Exercise

Page 14: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Summary: Design Principles

• Identify the aspects of your application that vary and separate them from what stay the same

• Program to an interface not implementation

• Favor composition over inheritance

Page 15: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Example: KitchenViewer Interface

Wallcabinet

Counter

Floorcabinet

Modern Classic Antique Arts & Crafts

menu

display area

styles

Adapted from Software Design: From Programming to Architecture by Eric J. Braude (Wiley 2003), with permission.

Page 16: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

KitchenViewer Example

Modern Classic Antique Arts & Crafts

Wall cabinets Floor cabinetsCountertop

Page 17: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Selecting Antique Style

Modern Classic Antique Arts & Crafts

Page 18: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

KitchenViewer Using Standard Inheritance

Kitchen

ClientrenderKitchen()

FloorCabinet

ModernWallCabinet

ModernFloorCabinet AntiqueFloorCabinet

AntiqueWallCabinet

WallCabinet

Aspect of the system thatmay change/vary?

: Reference direction

Page 19: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

AntiqueKStylegetWallCabinet()getFloorCabinet()

The Abstract Factory Idea

KitchenStylegetWallCabinet()getFloorCabinet()

ModernKStylegetWallCabinet()getFloorCabinet()

WallCabinet FloorCabinet

AntiqueWallCabinet AntiqueFloorCabinet

FloorCabinet getFloorCabinet() { return new AntiqueFloorCabinet(); }

……

FloorCabinet getFloorCabinet() { return new ModernFloorCabinet(); }

Page 20: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Abstract Factory Design Pattern Applied to KitchenViewer

KitchenStylegetWallCabinet()getFloorCabinet()

KitchengetWallCabinet()getFloorcabinet()

ClientrenderKitchen( KitchenStyle )

ModernKStylegetWallCabinet()getFloorCabinet()

ModernKStylegetWallCabinet()getFloorCabinet()

AntiqueKStylegetWallCabinet()getFloorCabinet()

WallCabinet FloorCabinet

ModernWallCabinet

ModernFloorCabinet

AntiqueWallCabinet

AntiqueFloorCabinet

Page 21: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Abstract Factory Design Pattern

StylegetComponentA()getComponentB()

ClientdoOperation( Style myStyle )

Style1getComponentA()getComponentB()

Style2getComponentA()getComponentB()

ComponentA ComponentB

Style1ComponentA

Style1ComponentB

Style2ComponentA

Style2ComponentB

Collection

Page 22: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Concrete and Abstract Layers

KitchenStyle

Kitchen

Client

ModernKStyle

AntiqueKStyle

WallCabinet

FloorCabinet

ModernWallCabinet

ModernFloorCabinet

AntiqueWallCabinet

AntiqueFloorCabinet

Abstract level

Concrete level

Page 23: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

getWallCabinet()

Abstract Factory Application Sequence Diagram

myStyle:KitchenStyleClient

myStyle:ModernKStyle

myStyle:AntiqueKStyle

renderKitchen( myStyle )

wallCabinet1:ModernWallCabinet

wallCabinet1:AntiqueWallCabinet

ModernWallCabinet()getWallCabinet()

AntiqueWallCabinet()

myStyle.getWallCabinet()

-- IF myStyle BELONGS TO ModernKStyle --

-- IF myStyle BELONGS TO AntiqueKStyle --

Page 24: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Potential use of this Design Pattern?

StylegetComponentA()getComponentB()

ClientdoOperation( Style myStyle )

Style1getComponentA()getComponentB()

Style2getComponentA()getComponentB()

ComponentA ComponentB

Style1ComponentA

Style1ComponentB

Style2ComponentA

Style2ComponentB

Collection

Page 25: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

References

• Design Patterns

• Headfirst Design Patterns

• Software Design

Page 26: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Example: Starbuzz Coffee

• The coffee shop offers a variety of beverages

HouseBlend

cost()

Beverage

description

getDescription();cost();// Other methods

DarkRoast

cost()

Decaf

cost()

Espresso

cost()

Page 27: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Problem

• A customer may also ask for condiments– steamed milk– soy– mocha (otherwise known as chocolate)– whipped milk

• Starbuzz charges a bit for each of these

Page 28: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and
Page 29: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

HouseBlend

cost()

Beverage

descriptionmilksoymochawhip

getDescription();cost();

hasMilk(); setMilk();hasSoy(); setSoy();hasMocha(); setMocha();hasWhip(); setWhip();

// Other methods

DarkRoast

cost()

Decaf

cost()

Espresso

cost()

Aspect of the system thatmay change/vary?

Attempt 1

Page 30: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Potential Changes

• Potential changes:– Price change to condiments– New condiments– Double moca– …

Page 31: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Design idea

• Basic idea: extension at run time, not compile time

• Definition: The Decorator pattern attaches additional features to an object dynamically. It provides a flexible alternative to subclassing for extending functionality

Page 32: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Design approach 1

• Each beverage contains a dynamic list of condiments

• Example– Take a DarkRoast object– Decorate it with a Mocha object– Decorate it with a Whip object

UML class model?

Page 33: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Decorator design

• Example– Take a DarkRoast object– Decorate it with a Mocha object– Decorate it with a Whip object– Call the cost() method and rely on delegation to

add on the condiment cost

• Decorator adds its own behavior before or after calling the decorated object

Page 34: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Decoration Delegation Process

Page 35: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Decorator Class Model

Client

objDecorated

DecoratordoAction()

1

ConcreteComponentdoAction()

ComponentdoAction()

void doAction(){ ….. // do actions special to this decoration objDecorated.doAction(); // pass along}

Adapted from Software Design: From Programming to Architecture by Eric J. Braude (Wiley 2003), with permission.

ConcreteDecoratorAdoAction()

ConcreteDecoratorBdoAction()

Page 36: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Sequence Diagram for Decorator

:Client

doAction()

decoration1:Decoration

doAction()

Decoration1.objDecorated:Decoration

:Component

doAction()

Adapted from Software Design: From Programming to Architecture by Eric J. Braude (Wiley 2003), with permission.

Page 37: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Decoration Features

• Decorators have the same supertype as the objects they decorate

• You can use one or more decorators to wrap an object– Thus, you can pass decorated object in place of

original (wrapped) object• The decorator adds its own behavior either

before or after delegating to the object it decorates to

• Objects can be decorated at any time, including run-time, with as many decorators as possible

Page 38: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Exercise

• Suppose we allow different sizes for the beverages– Tall (small)– Grande (medium)– Venti (large)

Page 39: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Some Common Design Patterns

Page 40: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Example: Weather-O-Rama

Page 41: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Weather-O-Rama

Page 42: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Weather-O-Rama InterfaceWeatherData

getTemperature();getHumidity();getPressure();measurementsChanged();setMeasurements(); // other methods

This method gets called wheneverthe weather measurements have been updated.

Page 43: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

First Implementationvoid measurementsChanged() {

float temp = getTemperature() ;

float humidity = getHumidity() ;

float pressure = getPressure() ;

currentConditionsDisplay->update(temp, humidity, pressure) ; statisticsDisplay->update(temp, humidity, pressure) ;

forecastDisplay->update(temp, humidity, pressure) ;

}

By coding to concrete implementation, we have no way of allowing other displays and plug in.

Page 44: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Observer Pattern

• Design Purpose: defines a run-time, one-to-many dependency between objects so that when one object (the subject) changes state, all of the dependents (observers) are notified.

Page 45: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Observer Design Pattern

SubjectregisterObserver();removeObserver();notifyObservers();

Observerupdate()

ConcreteSubjectgetState();setState();

ConcreteObserver

update()

for all Observer’s o: o.update();

Client1..n

Server part Client part

Page 46: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

How does Observer apply these design principles?

• Identify the aspects of your application that vary and separate them from what stay the same

• Program to an interface not implementation

• Favor composition over inheritance

Page 47: CS427a: Object-Oriented Programming - Yale Universityzoo.cs.yale.edu/classes/cs427/2011a/lectures/ln23b.pdf · CS427a: Object-Oriented Programming Design Patterns for Flexible and

Discussion

• Java Observation design: update(Observable o, Object obj);

SubjectregisterObserver();removeObserver();notifyObservers();

Observerupdate()

ConcreteSubjectgetState();setState();

ConcreteObserver

update()

for all Observer’s o: o.update();

1..n

SubjectregisterObserver();removeObserver();notifyObservers();

Observerupdate()

ConcreteSubjectgetState();setState();

ConcreteObserver

update()

for all Observer’s o: o.update();

Client1..n