You are on page 1of 162

1

OO

Joe
SimUDuck
OO
Superclass

Duck


Quack
Swim

ubtype
s

ay()
l

disp

quack()
swim()
display()
//

MallardDuck

RedheadDuck

display() {

display() {

// }

// }

display()

Duck

Joe
JoeJoeOO
Duck
fly()
fly()OO

Joe

Duck
quack()
swim()


()
ly
f

MallardDuck

display()

fly()

Joe

//

RedheadDuck

display() {

display() {

// }

// }

Joe

Monster.com

JoeDuck
JoeDuck

SimUDuck

reuse

Duck

)
ly(
f

ly(
f ly()

MallardDuck
display() {
//
}

quack()
swim()
display()

fly()

//

RedheadDuck
display() {
//
}

RubberDuck
quack() {
//
}
display() {
//
}

()
quack

ueak
sq

Joe

DecoyDuck

fly()
quack()

RubberDuck
quack() { // }
display() { // }

fly() {
//
}

DecoyDuck

quack() {
//
}

display() { // }
fly() {
//
}

Sharpen your pencil


Duck

A.

D.

B.

E.

C.

F.

Joe

Joe

fly()quark()

fly()
Flyable

Quackable

Duck
Flyable
fly()

quack()

MallardDuck
display()
fly()
quack()

swim()
display()

Quackable

//

RedheadDuck
display()
fly()
quack()

DecoyDuck

RubberDuck
display()
quack()

display()

48Duck
!

Joe

FlyableQuackable

OO

EGNAHC

Sharpen your pencil

FlyableQuackable
FlyableJava

Duck

fly()quack()Duck
Duck

Duck
flyquack

Duckfly()quack()

DuckDuck

Duck

10

FlyBehaviorQuackBehavior
FlyingQuacking
FlyBehaviorQuackBehavior
Duck
Duck

<<interface>>

FlyBehavior
fly()

FlyBehavior
QuackBehavior

FlyBehaviorQuakcBehavior

FlyWithWings
fly() {

FlyNoWay
fly() {

//
}

//
}

11

FlyBehavior

supertype

Javainterface
JavaAinterface

AnimalDogCatAnimal

Dog d = new Dog( );


d.bark( );

Animal
makeSound()

dDog

Animal

Animal animal = new Dog( );


animal.makeSound( );

Dog
makeSound() {
bark( );
}
bark( ) { // }

12

Cat
makeSound() {
meow( );
}
meow( ) { // }

animal

new Dog()

a = getAnimal( );
a.makeSound( );



makeSound()

FlyBehaviorQuackBehavior

y()
fl

)
quack(

<<interface>>

<<interface>>

QuackBehavior

FlyBehavior

quack()

fly()

FlyWithWings
fly() {

FlyNoWay

//
}

Quack

fly() {

quack() {

//

// }

MuteQuack
quack() {

//
}

Squeak
quack() {

//
}

13

&

OO

Duck

Duck

DuckDuck

Duck

Sharpen your pencil

SimUDuck

DuckCall

2)

1)
FlyRocketPowered
FlyBehavior

14

delegate
Duck

DuckflyBehaviorquack
Behavior
FlyWithWings
Squeak
Duckfly()quack()
FlyBehaviorQuackBehavior
performFly()performQuack()Duckfly()
quack()

)
fly(
quack()

Duck
FlyBehavior flyBehavior
QuackBehavior quackBehavior
performQuack()
swim()
display()
performFly()
//

performQuack()

public class Duck {


QuackBehavior quackBehavior;
//

public void performQuack() {


quackBehavior.quack();
}

ackBehavior
u
Q

kBehavior
quac

DuckquackBehavior
quackBehavior

15

flyBehaviorquackBehavior
MallardDuck
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}

MallardDuckDuck
flyBehaviorquackBehavior

k
c
a
u
Q

uack()
Q
m
r
o
f
r
e
p

Quack

avior
FlyBeh
gs
in
hW
it
yW
Fl

public void display() {


System.out.println(Im a real Mallard duck);
}

MallardDuck
quackBehaviorQuackQuack
QuackBehavior
MallardDuck
flyBehaviorFlyWithWingsFlyWithWings
FlyBehavior

16

Quack

QuackFlyWithWings

quackBehavior

QuickBehavior

17

Duck
1

DuckDuck.java
MallardDuckMallardDuck.java
public abstract class Duck {

package

FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public abstract void display();
public void performFly() {
flyBehavior.fly();
}

public void performQuack() {


quackBehavior.quack();
}

}
2

public void swim() {


System.out.println(All ducks float, even decoys!);
}

FlyBehaviorFlyBehavior.java
FlyWithWings.javaFlyNoWay.java
public interface FlyBehavior {
public void fly();
}

public class FlyWithWings implements FlyBehavior {


public void fly() {

System.out.println(Im flying!!);
}
}

public class FlyNoWay implements FlyBehavior {


public void fly() {
System.out.println(I cant fly);
}
}

18

Duck
3

QuackBehaviorQuackBehavior.java
Quack.javaMuteQuack.javaSqueak.java
public interface QuackBehavior {
public void quack();
}
public class Quack implements QuackBehavior {
public void quack() {
System.out.println(Quack);
}
}
public class MuteQuack implements QuackBehavior {
public void quack() {

System.out.println(<< Silence >>);
}
}
public class Squeak implements QuackBehavior {
public void quack() {

System.out.println(Squeak);
}
}

MiniDuckSimulator.java
public class MiniDuckSimulator {
public static void main(String[] args) {
uck
Duck mallard = new MallardDuck();
MallardD

mallard.performQuack();

performQuack()

mallard.performFly();
ehavior
kB
ac
Qu

kBehavior
}
quac

File Edit Window Help Yadayadayada

quack()

performFly()

%java MiniDuckSimulator
Quack

Im flying!!

19

setter method

1 Duck
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}

Duck
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;

public void setQuackBehavior(QuackBehavior qb) {


quackBehavior = qb;
}

swim()
display()
performQuack()
performFly()
setFlyBehavior()
setQuackBehavior()

//

ModelDuck.java
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();

quackBehavior = new Quack();
}

}
3

public void display() {


System.out.println(Im a model duck);
}

FlyBehavior
FlyRocketPowered.java

public class FlyRocketPowered implements FlyBehavior {


public void fly() {
System.out.println(Im flying with a rocket!);
}
}

20

MiniDuckSimulator.java

public class MiniDuckSimulator {


public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
Duck model = new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered());

model.performFly();

mFly()
or
rf
pe

lyNoWay
F

r
o
i
v
a
h
e
B

fly

sett
er

File Edit Window Help Yabadabadoo

%java MiniDuckSimulator
Quack

Im flying!!
I cant fly

Im flying with a rocket!

setter

21

Observer

Jerry

Jerry

JDK
,

37

Weather-O-Rama
Internet

-O-Rama
Weather
t
n Stree
1
100 Mai
OK 4502
,
y
e
All
Tornado

et
n
r
e
t
n
I

herData

t
a

t
a

D
r

e
ath

We

t
c
e
j
rOb
Weathe
ama

her-O-R
t

a
e

PI

P
A

a
m

a
-O-R

Weather

alpha

ma
a
R
O
r
e
Weath

icane
r
r
u
H

a
y
t
n
a
D
r
e
John
h
Weat

38

WeatherData

25
60

WeatherData

Weather-O-Rama

WeatherDataWeatherData

WeatherData

39

WeatherData
WeatherData

a
t
a
rD
Weathe

WeatherData

getTemperature( )
getHumidity( )
getPressure( )
measurementsChanged( )

ect
j
b
O
r
e
h
t
a
e
W

25
60

40

/*
*
*/
public void measurementsChanged() {
//
}

WeatherData.java

measurementsChanged()

Weather-O-Rama

m WeatherDatagetter

getTemperature()
getHumidity()
getPressure()

m measurementsChanged()

measurementsChanged()

22
16
28

WeatherData


25
60

TT
T

41

Weather-O-Rama
measurementsChanged()
public class WeatherData {
//
public void measurementsChanged() {
float temp = getTemperature();
float humidity = getHumidity();
float pressure = getPressure();

Weath erDat a
getXxx()
getXxx()

currentConditionsDisplay.update(temp, humidity, pressure);


statisticsDisplay.update(temp, humidity, pressure);
forecastDisplay.update(temp, humidity, pressure);
}
// WeatherData
}

A.

D.
E.

B.

F. WeatherData

C.

SWAG:Scientific Wild A** Guess

42

public void 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);
}


update()

43

44

+=

Subject
Observer

int

45

int

int

int

8
8
8

46

8
int

int

14

int

14
14
14

47

Ron
Java

Java

2
/


Jill
EJB
Java

4
3

48

RonJill

Java


JavaBeans
Java

Jill

49

Jill

Ron

Ron

50

8
8
8

int

SubjectObserver

51

te()
upda

<<interface>>

<<interface>>

Subject

Observer

registerObserver()

update()

removeObserver()
notifyObservers()

ConcreteSubject

)
notifyObservers(

ConcreteObserver

registerObserver() {}

update()

removeObserver() {}

//

notifyObservers() {}

getState()
setState()

there are no

Dumb Questions

OO

52

Observer

Observer

OO

53

WeatherData

54

Su

Mary
Sue
Mary

MaryWeatherData

SueWeatherData
Mary

Sue
Mary
Sue
Mary
SueWeatherData
WeatherData
MaryWeatherData

Sue
WeatherData

Maryupdate()
WeatherData
Sueupdate()

55

<<interface>>
Subject
registerObserver()

display()

<<interface>>
DisplayElement

<<interface>>
Observer
update()

display()

removeObserver()
notifyObservers()

CurrentConditionsDisplay
update()

ThirdPartyDisplay

display() { //

WeatherData

update()

registerObserver()

display() { //

removeObserver()

notifyObservers()

StatisticsDisplay

WeatherData

getTemperature()
getHumidity()
getPressure()
measurementsChanged()

update()
display() { //

ForecastDisplay

We at he rD
Subject

at a

update()

display() { //

subject
WeatherData

56

MarySue
Java
Java

public interface Subject {


public void registerObserver(Observer o);

public void removeObserver(Observer o);


public void notifyObservers();
}

public interface Observer {


public void update(float temp, float humidity, float pressure);
}

update()

Mary
Sue

public interface DisplayElement {


public void display();

DisplayElement

display()

MarySue

57

WeatherData

import
package

WeatherData

wickedlysmart

URL
xxxv

public class WeatherData implements Subject {


private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
observers = new ArrayList();
}

Subject

public void registerObserver(Observer o) {


observers.add(o);
}
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if (i >= 0) {
observers.remove(i);
}
}

ist
ArrayL

ArrayList

ArrayList

ArrayList


update()

public void notifyObservers() {


for (int i = 0; i < observers.size(); i++) {
Observer observer = (Observer)observers.get(i);
observer.update(temperature, humidity, pressure);
}

public void measurementsChanged() {


notifyObservers();
}

58

WeatherData
Subject

public void setMeasurements(float temperature, float humidity, float pressure) {


this.temperature = temperature;

this.humidity = humidity;
this.pressure = pressure;

measurementsChanged();

}

// WeatherData

WeatherDataWeather-O-Rama

ver
DisplayEl
r
e
s
b
O

ement

API

a
t
a

r
e

t
a

public class CurrentConditionsDisplay implements Observer, DisplayElement {


private float temperature;
private float humidity;
weatherData
private Subject weatherData;

public CurrentConditionsDisplay(Subject weatherData) {


this.weatherData = weatherData;
weatherData.registerObserver(this);
}
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;

update()
this.humidity = humidity;

display();

}
display()
public void display() {
System.out.println("Current conditions: " + temperature
+ "F degrees and " + humidity + "% humidity");
}
}

display()

there are no

Dumb Questions

display()

View-Controller

MVCModelupdate()

display()

Subject

Subject

59

public class WeatherStation {


public static void main(String[] args) {
WeatherData weatherData = new WeatherData();

ta
WeatherDa

CurrentConditionsDisplay currentDisplay =
new CurrentConditionsDisplay(weatherData);
StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);
ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);
weatherData.setMeasurements(80, 65, 30.4f);
weatherData.setMeasurements(82, 70, 29.2f);
weatherData.setMeasurements(78, 90, 29.2f);

}
}

File Edit Window Help StormyWeather

%java WeatherStation
Current conditions: 80.0F degrees and 65.0% humidity
Avg/Max/Min temperature = 80.0/80.0/80.0
Forecast: Improving weather on the way!
Current conditions: 82.0F degrees and 70.0% humidity
Avg/Max/Min temperature = 81.0/82.0/80.0
Forecast: Watch out for cooler, rainy weather
Current conditions: 78.0F degrees and 90.0% humidity
Avg/Max/Min temperature = 80.0/82.0/78.0
Forecast: More of the same
%

60

WeatherData

JohnnyAHurricaneWeather-O-RamaCEO
HeatIndex
T
RH

heatindex =

16.923 + 1.85212 * 10-1 * T + 5.37941 * RH - 1.00254 * 10-1 * T


* RH + 9.41695 * 10-3 * T2 + 7.28898 * 10-3 * RH2 + 3.45372 * 10-4
* T2 * RH - 8.14971 * 10-4 * T * RH2 + 1.02102 * 10-5 * T2 * RH2 3.8646 * 10-5 * T3 + 2.91583 * 10-5 * RH3 + 1.42721 * 10-6 * T3 * RH
+ 1.97483 * 10-7 * T * RH3 - 2.18429 * 10-8 * T3 * RH2 + 8.43296 *
10-10 * T2 * RH3 - 4.81975 * 10-11 * T3 * RH3

HeatIndexDisplay.java
heatindex.txt
heatindex.txtwickedlysmart.com
Head First
Google

File Edit Window Help OverdaRainbow

%java WeatherStation
Current conditions: 80.0F degrees and 65.0% humidity
Avg/Max/Min temperature = 80.0/80.0/80.0
Forecast: Improving weather on the way!
Heat index is 82.95535
Current conditions: 82.0F degrees and 70.0% humidity
Avg/Max/Min temperature = 81.0/82.0/80.0
Forecast: Watch out for cooler, rainy weather
Heat index is 86.90124
Current conditions: 78.0F degrees and 90.0% humidity
Avg/Max/Min temperature = 80.0/82.0/78.0
Forecast: More of the same
Heat index is 83.64967
%

61

Observer

62

getter

getter

Java
Observer

63

Java

Java

JavaAAPI
java.utilpackage

Java
Observable

API

ObserverObservable
SubjectObserver
ObserverObservable

pushpull

java.uitl.Observerjava.util.
Observable

OO

Observable

Observable

WeatherData

Observable
addObserver()
deleteObserver()
notifyObservers()
setChanged()

<<interface>>

observers

update()

GeneralDisplay
WeatherData

StatisticsDisplay
update()
display()

update()
display()

Subject

Observable

move()
register()re

)
notifyObservers(

64

Observable

getTemperature()
getHumidity()
getPressure()

Observer



DisplayElement

ForecastDisplay
update()
display()

ate()
upd

update()
Observer

Java
Java
WeatherDataObservable
Java

java.uitl.ObserverObservable
addObserver()deleteObserver()

java.util.Observable

1 setChanged()
2 notifyObservers()
notifyObservers()

notifyObservers(Object arg)

data object

update(Observable o, Object arg)

notifyObservers()

push
notifyObservers(arg)pull

65

setChanged()

setChanged()notifyObservers()
notifyObservers()setChanged()
Observable


setChanged() {
changed = true
}

le
b
a
v
r
Obse

notifyObservers(Object arg) {
if (changed) {
for every observer on the list {
call update (this, arg)
}
changed = false
}
}

changed
setChanged()
true

notifyObservers()

changedtrue

changedfalse

notifyObservers() {
notifyObservers(null)
}

setChanged()
setChanged()
WeatherData

setChanged()

setChanged()
clearChanged()changedfalsehasChanged()
changed

66

WeatherData
java.util.Observable
1

impor t
Observer/Observable

Observable

import java.util.Observable;
import java.util.Observer;
public class WeatherData extends Observable {
private float temperature;
private float humidity;
private float pressure;

public WeatherData() { }

public void measurementsChanged() {


setChanged();

notifyObservers();
}

notifyObservers()

public void setMeasurements(float temperature, float humidity, float pressure) {


this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
5 notifuObservers()
measurementsChanged();
setChanged()
}
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
}

WeatherData

67

CurrentConditionsDisplay

i mport
Observer/Observable
2

java.util.Observer

import java.util.Observable;
import java.util.Observer;
public class CurrentConditionsDisplay implements Observer, DisplayElement {
Observable observable;
private float temperature;
3
private float humidity;
public CurrentConditionsDisplay(Observable observable) {
this.observable = observable;
observable.addObserver(this);
}

Observable
CurrentCondi-tionsDisplay

public void update(Observable obs, Object arg) {


if (obs instanceof WeatherData) {
WeatherData weatherData = (WeatherData)obs;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
display();
}
}
public void display() {
System.out.println("Current conditions: " + temperature
+ "F degrees and " + humidity + "% humidity");
}
}

update()
Observable

update()
WeatherData
getter

display()

68

ForecastDisplay

stD
eca
r
o
F
) {
lic
pub rvable
e
obs

isp

lay

er
Obs

ob se rv ab le .a dd

vab

le

di sp la y( );
Ob se rv er (t hi s)

if (observable instanceof WeatherData) {

impl emen ts
publ ic clas s Fore cast Disp lay
{
nt
leme
layE
Disp
,
Obse rver
id di sp la
pu bl ic vo

//
}

y( ) {

re
ssu
re;
Pre
ssu
t
e
e
r
g
tP
a.
ren
Dat
cur
her
t
=
a
e
w
ure
e =
ess
sur
tPr
s
s
e
a
r
l
tP
ren
cur

();

pr iv at e fl
oa t cu rr en
tP re ss ur e
pr iv at e fl
= 29 .9 2f ;
oa t la st Pr
es su re ;
We at he rD at a we
at he rD at a =
(W ea th er Da ta )o
bs er va bl e;

va
up da te (O bs er
pu bl ic vo id
{
Ob je ct ar g)

le ,
bl e ob se rv ab

Ob se rv ab le ;
im po rt ja va .u ti l.
Ob se rv er ;
l.
ti
im po rt ja va .u

69

File Edit Window Help TryTihisAtHome

%java WeatherStation
Forecast: Improving weather on the way!
Avg/Max/Min temperature = 80.0/80.0/80.0
Current conditions: 80.0F degrees and 65.0% humidity
Forecast: Watch out for cooler, rainy weather
Avg/Max/Min temperature = 81.0/82.0/80.0
Current conditions: 82.0F degrees and 70.0% humidity
Forecast: More of the same
Avg/Max/Min temperature = 80.0/82.0/78.0
Current conditions: 78.0F degrees and 90.0% humidity
%

java.uitl.ObservablenotifyObservers()

70

java.util.ObservableOO

java.util.Observable

java.util.Observable

Observable

Observable
ObservableJava
Observable

ObservableJava
Observer APIjava.util

Observable
Observable APIsetChanged()
protectedObservable
Observable

java.util.ObservableObservable

71

Swing

JDK

JDKjava.utilJavaBeans
Swing
APISwing

s
JavaBean

Listener
PropertyChange

SwingAAPIJButtonJButton
AbstractButtonlistener
SwingActionListener
Swing API

Should I do it?

AngelListenerDevilListener

File Edit Window Help HeMadeMeDoIt

%java SwingObserverExample

72

Come on, do it!


Dont do it, you might regret it!
%

JButton
JFrameinnerAclass
SwingSwing
Head First JavaGUI

public class SwingObserverExample {


JFrame frame;

Swing

JFrame

public static void main(String[] args) {


SwingObserverExample example = new SwingObserverExample();
example.go();
}
public void go() {
frame = new JFrame();
JButton button = new JButton("Should I do it?");
button.addActionListener(new AngelListener());
button.addActionListener(new DevilListener());
frame.getContentPane().add(BorderLayout.CENTER, button);
// frame

}
class AngelListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
System.out.println("Don't do it, you might regret it!");
}
}
class DevilListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
System.out.println("Come on, do it!");
}
}
}

JButton

update()
actionPerformed()

73

OO


loosecoupl-

OO

ing


pushpull

Java
java.util.
Observable

OO

MVC

74

java.util.Observable


Observable

Swing
GUI


JavaBeansRMI

75

4
1

6
4

7
5

10

11
8
11

10

12

13

12

14
15
14

13

15

16
17

1816
17

18

19
19

20
20

21

22
21

Across

Acrossis a ______ not an interface


1. Observable
1. Observable
a ______
interface
3. Devil
and Angel areis_______
to not
the an
button
3. Devil and
_______
4. Implement
this Angel
methodare
to get
notifiedto the button
Implement
5. Jill4.got
one of herthis
ownmethod to get notified
5. Jill got one of her own
6. CurrentConditionsDisplay
implements this
6. CurrentConditionsDisplay implements this
interface
interface
8. How
to get yourself off the Observer list
8. How
to this
get yourself
off the
Observer
12. You
forgot
if you're not
getting
notifiedlist
when
12. You
you think
you forgot
should this
be if you're not getting notified
when
you think
be observers
15. One
Subject
likes toyou
talkshould
to _____
15. One
to talk to _____ observers
18. Don't
countSubject
on this likes
for notification
18. Don't count
on thisand
for_______
notification
19. Temperature,
humidity
19. Temperature,
humidity
_______
20. Observers
are ________
on theand
Subject
20. Observers
are ________
the Subject
21. Program
to an _______
not an on
implementation
Program
to anto_______
not an
22. A21.
Subject
is similar
a __________
implementation
22. A Subject is similar to a __________

76

22

Down

2.Down
Ron was both an Observer and a __________
Ron
wastoboth
Observer
and a __________
3.2.You
want
keep an
your
coupling ________
to keep
7.3.HeYou
sayswant
you should
go your
for it coupling ________
He says
should
for it for you
9.7._____
can you
manage
yourgo
observers
9. Java
_____
can manage
observers
10.
framework
with your
lots of
Observersfor you
10.Weather-O-Rama's
Java framework with
lots of after
Observers
11.
CEO named
this kind of
11. Weather-O-Rama's CEO named after this
storm
kind
of storm
13.
Observers
like to be _________ when something
13.happens
Observers like to be _________ when
new
something
new happens
14.
The WeatherData
class _________ the Subject
14. The WeatherData class _________ the
interface
Subject
interface
16.
He didn't
want any more ints, so he removed
16. He didn't want any more ints, so he removed
himself
himself
17.
CEO almost forgot the ______ index display
17.Subject
CEO almost
display
19.
initially forgot
wantedthe
to ______
____ all index
the data
to
Observer
19. Subject initially wanted to ____ all the data
to Observer

q
q

B .

q D .

q E .

C .

q F . W e a t h e r D a t a

77

ser vab le;


imp ort jav a.u til .Ob
ser ver ;
imp ort jav a.u til .Ob

imple ments
publi c class Forec astDi splay
Obser ver, Displ ayEle ment {
pr iv at e fl
oa t cu rr en
tP re ss ur e
pr iv at e fl
= 29 .9 2f ;
oa t la st Pr
es su re ;
Obse rvab
publ ic Fore cast Disp lay(
obse rvab le) {

le

Wea the rDa ta wea


the rDa ta =
(We ath erD ata )ob
ser vab le;
obs erv abl e.a ddO
}

bse rve r(t his );

va
up da te (O bs er
pu bl ic vo id
{
g)
ar
ct
je
Ob

le ,
bl e ob se rv ab

if (observable instanceof WeatherData) {

lastPres sure = currentP ressure;


);
currentP ressure = weatherD ata.getP ressure(
dis pla y() ;

}
}

y( ) {
id di sp la
pu bl ic vo

//

2
4

5
7
8

11

20

D
E

78

J
M

E
P

10

C
E

W
C

13

19

14

15

16

18

U
S

L
R

M
U

E
N

S
H

I
A

I
17

12

L
O

E
21

T
22

Across

Down

1. Observable is a ______ not an interface [class]


3. Devil and Angel are _______ to the button

2. Ron was both an Observer and a __________


[Subject]

79

Starbuzz

Beverage

description

st
Dark Roa

Beverage
description

cost()

getDescription()
cost()

getDescription()

//

HouseBlend
cost()

DarkRoast
cost()

Decaf
cost()

cost()

80

Espresso
cost()

Steamed MilkSoy
Mocha

Beverage
description
getDescription()
cost()
//

DarkRoastWithSteamedMilk
andMocha

HouseBlendWithSteamedMilk
andMocha
HouseBlendWithSteamedMilk
cost()
andCaramel
HouseBlendWithWhipandMocha

cost()

cost()

cost()

HouseBlendWithMocha
cost()
HouseBlendWithSoyandMocha

cost()

HouseBlendWithSteamedMilk
andSoycost()
cost()

cost()

cost()
DarkRoastWithWhipandMocha

cost()

HouseBlendWithSoy
cost()
DarkRoastWithSteamedMilk
andSoy

HouseBlendWithWhip

cost()
DarkRoastWithSteamedMilk

cost()
HouseBlendWithSteamedMilk

andWhip

EspressoWithWhipandMocha

cost()

cost()

EspressoWithMocha

cost()

EspressoWithSteamedMilk
DecafWithSoy
andSoy
DecafWithSteamedMilk
cost()
andSoy EspressoWithSteamedMilk
cost()

DarkRoastWithSoy
cost()
DecafWithSteamedMilk
cost()
DecafWithSoyandMocha
DarkRoastWithSoy
DarkRoastWithSoyandMocha
cost()
DecafWithSoy
cost()
DecafWithSoyandMocha
cost()
EspressoWhip
cost()
cost()

cost()

DecafWithWhip
cost()

DarkRoastWithWhip

cost()
HouseBlendWithWhipandSoy

cost()

EspressoWithSteamedMilk
andCaramel

DecafWithWhipandMocha

cost()
DecafWithMocha

cost()

DarkRoastWithMocha

HouseBlendWithSteamedMilk
cost()
cost()

DecafWithSteamedMilk
andCaramel

DarkRoastWithSteamedMilk
andCaramel

cost()

EspressoWithSteamedMilk
andMocha

DecafWithSteamedMilk
andMocha

cost()

cost()

EspressoWithSteamedMilk
andWhip
DecafWithSteamedMilk
DarkRoastWithSteamedMilk
cost()
andWhip
andWhip
EspressoWithWhipandSoy
DecafWithWhipandSoy
cost()
DarkRoastWithWhipandSoy
cost()
cost()

cost()

cost()

cost()

cost()

cost()

81

Beverage

Beverage
description
milk
soy
mocha
whip
getDescription()
cost()
hasMilk()
setMilk()
hasSoy()
setSoy()
hasMocha()
setMocha()
hasWhip()
setWhip()
//

82

Beveragecost()
cost()
cost()
cost()


Beverage
description
milk
soy
mocha
whip

cost()

()
cost

getDescription()
cost()

cost()

cost()

HouseBlend
cost()

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

DarkRoast

Decaf

cost()

cost()

Espresso
cost()

cost()Java
public class Beverage {
public double cost() {

public class DarkRoast extends Beverage {


public DarkRoast() {
description = Most Excellent Dark Roast;
}
public double cost() {

83

cost()

TeahasWhip()

84

compositiondelegation

bug

85

bug

86

there are no

Dumb Questions

OO

OO

Subject

OO

Observ

-able

OO

87

decorate

DarkRoast

Mocha

Whip

cost()delegate

88

st
DarkRoa

e
g
Bevera

cost()

DarkRoast

cost()

DarkRoast
2

Mocha
MochaDarkRoast
wrap

Mocha

ge
ra
ve
Be

st()
o
c

rage
Mocha
Beve

a
h
c
o
M
erage
MochaBev

e
g
a
Bever

cost()

cost()

DarkRoast

Mocha

WhipWhipMocha
DarkRoastBeveragecost()

cost()

cost()

Whip

cost()

DarkRo

Mocha

Whip
a st

DarkRoast
cost()

MochaWhipDarkRoast
BeverageDarkRoast
cost()

89

Whipcost()
Whipcost()Mocha

WhipMochacost()

2
1

.10

MochaDarkRoast
cost()

cost()

.20

cost()

Whip
6

Whipcost()

$1.29

WhipMocha
$0.10
$1.29

.99

cost()

t
D ar k Ro as

Mocha

DrakRoast
$0.99

MochaDarkRoast
$0.20
$1.19

90

Component

component

methodA()
methodB()

//

ConcreteComponent

Component

Component
ConcreteComponent

methodA()

methodA()

methodB()

methodB()

//

//

ConcreteDecoratorA
Component wrappedObj

ConcreteDecorator

onent
Comp

methodA()
methodB()
newBehavior()
//

Decorator

ConcreteDecoratorB
Component wrappedObj
Object newState
methodA()
methodB()
//

Component

91

Beverage
Component
component

Beverage
description
getDescription()
cost()
//

HouseBlend

CondimentDecorator

DarkRoast

cost()

cost()

getDescription()

Espresso
cost()

Decaf
cost()

Milk

Mocha

Soy

Whip

Beverage beverage

Beverage beverage

Beverage beverage

Beverage beverage

cost()

cost()

cost()

cost()

getDescription()

getDescription()

getDescription()

getDescription()

cost()getDescription()

cost()
getDescription()

92

Mar

Sue
MaryCondimentDecoratorBeverage
Sue

Mary

Sue

MaryBeverage

Sue
Mary

Sue

Mary

Sue
MarycomponentBeverage

SueBeverage
Java

93

OK

Whip Moch ac ost(

2
1


Whi pco st()

$1.29

.10

cost()

.20

WhipMocha
$ 0.10
$ 1.29

MochaDarkRoast
cost()

cost()

cost()

Whip
6

t
.99 D
ar k Ro as

Mocha

DrakR oast
$0 .99

Mocha Dar kRoas t


$0.20
$1 .19

zz

end

eBl
s

u
Ho

Coffee

94

tarbuzz

Starbu

.89
.99
1.05
1.99
.10
.20
.15
.10

Beverage

public abstract class Beverage {


String description = "Unknown Beverage";
public String getDescription() {
return description;
}

ge
ra
ve
Be
cost()
ip-tion()
getDescr

getDescription()
cost()

public abstract double cost();

BeverageCondiment

ecorator
Condiment D

Condimen
rage
e
v
e
B

age
Bever
Decorator

public abstract class CondimentDecorator extends Beverage {


public abstract String getDescription();
}

getDescription()

95

Espresso
cost()

public class Espresso extends Beverage {


public Espresso() {
description = "Espresso";
}

public double cost() {


return 1.99;
}

presso
Es

Espresso
Beverage

description
Beverage

Espresso

Espresso

$1.99

public class HouseBlend extends Beverage {


public HouseBlend() {
description = "House Blend Coffee";
}

public double cost() {


return .89;
}

Espresso
Espresso"HouseBlendCoffee"
$0.89

DarkRoastDecaf

96

.89
.99
1.05
1.99
.10
.20
.15
.10

BeverageHouseBlend
CondimentDecorator

or
ecorat
D
t
n
e
m
i
Cond

rage
e
g
Beve

evera
a
B
ch
Mo
CondimentDecorator

(1)
public class Mocha extends CondimentDecorator {

Beverage beverage;

(2)

public Mocha(Beverage beverage) {

this.beverage = beverage;

public String getDescription() {


return beverage.getDescription() + ", Mocha";
}

public double cost() {


return .20 + beverage.cost();
}

Mocha

Mocha

DarkRoast
DarkRoast, Mocha

Mocha

SoyWhip

97

public class StarbuzzCoffee {


public static void main(String args[]) {
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription()
+ " $" + beverage.cost());

spresso
E

DarkRoast

Mocha
Mocha

Beverage beverage2 = new DarkRoast();


beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
Whip
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription()
+ " $" + beverage2.cost());

Beverage beverage3 = new HouseBlend();


beverage3 = new Soy(beverage3);
beverage3 = new Mocha(beverage3);
beverage3 = new Whip(beverage3);
System.out.println(beverage3.getDescription()
+ " $" + beverage3.cost());

File Edit Window Help CloudsInMyCoffee

% java StarbuzzCoffee
Espresso $1.99
Dark Roast Coffee, Mocha, Mocha, Whip $1.49
File Edit Window Help CloudsInMyCoffee
House Blend Coffee, Soy, Mocha, Whip $1.34
%

98

HouseBlend

there are no

Dumb Questions

HouseBlend

HouseBlend

CondimentPrettyPrint

Mocha,Whip,AMocha
Whip,DoubleAMocha
getDescription()
ArrayList
CondimentPrettyPrint

getDescription()
Whip,DoubleAMocha

Mocha,Whip,Mocha

tallgrandeventi
BeveragegetSize()
setSize()
0.100.150.20

99

Java I/O

Java I/O
java.io
API
I/O

ered

e
InputStr

ff

ne
Nu
mberInputStrea

LineNumberInputStream

Li

Bu

FileInputStream

BufferedInputStream

readLine()

BufferedInputStreamLineNumberInputStream
FilterInputStreamFilterInputStream

100

Java

tream

FileInpuS

tream

ferInputS
I/O
f
u
B
g
n
i
r
t
StreamS

FileInput

m
a
e
r
t
InputS

ByteArray

java.io

FilterInputStream

InputStream

FileInputStream

StringBufferInputStream

PushbackInputStream

FilterInputStream

ByteArrayInputStream

BufferedInputStream

InputStream

DataInputStream

LineNumberInputStream

ObjectInputStream

java.io
java.ioAAPI

Reader /
Writer/

JavaAI/O
API

API

101

Java I/O

Java I/0
Java I/O

FilterInputStream
read()

I know the Decorator Pattern therefore


I RULE!i know the
decorator pattern therefore i rule!

.io
java

FilterInputStream
InputStream

public class LowerCaseInputStream extends FilterInputStream {


public LowerCaseInputStream(InputStream in) {
super(in);
}
public int read() throws IOException {
int c = super.read();
return (c == -1 ? c : Character.toLowerCase((char)c));
}

public int read(byte[] b, int offset, int len) throws IOException {


int result = super.read(b, offset, len);
for (int i = offset; i < offset+result; i++) {
b[i] = (byte)Character.toLowerCase((char)b[i]);
read()
}
return result;

packageimport
xxxv
wickedlysmartURL

102

Java I/O
I/O
public class InputTest {
public static void main(String[] args) throws IOException {
int c;
try {
eam
InputStream in =
InputStr
e
l
i
F

new LowerCaseInputStream(
eam
r
t
S
t
u
p
n
I
d
new BufferedInputStream(
Buffere
utStream
r CaseInp
e
w
new FileInputStream("test.txt")));
o
L

while((c = in.read()) >= 0) {


System.out.print((char)c);
}

in.close();
} catch (IOException e) {
e.printStackTrace();
}

I know the Decorator Pattern therefore I RULE!

test.txt file

File Edit Window Help DecoratorsRule

% java InputTest
i know the decorator pattern therefore i rule!
%

103

HeadFirst

HeadFirst

HeadFirst
Java I/O
InputStream
HeadFirst

HeadFirst,

HeadFirstFactoryBuilder

HeadFirst

104

OO

OO

OO

105

public class Beverage {


//milkCostsoyCostmochaCost
//whipCost
//milksoymochawhip
//gettersetter

public class DarkRoast extends Beverage {


public DarkRoast() {
description = Most Excellent Dark Roast;
}

public double cost() {

public double cost() {

float condimentCost = 0.0;


if (hasMilk()) {
condimentCost += milkCost;
}
if (hasSoy()) {
condimentCost += soyCost;
}
if (hasMocha()) {
condimentCost += mochaCost;
}
if (hasWhip()) {
condimentCost += whipCost;
}
return condimentCost;

return 1.99 + super.cost();

House Blend
2 WhipMochacos

t()

cost
3 MochaMocha

Whipcost()

Coff

tarb

uzz
$1.54

.10

cost()

.20

ee S

W
10

Whipcost()Mocha
0.10
$1.54

106

hip

cost() cost()

.20

Mo

.15

cha

oc

ha

cost()

So

.89

()

MochaSoycost()
SoyHouseBlend
cost()
()
6 HouseBlendcost

0.89Soy

cost()

nd
HouseBle

Soycost()HouseBlend
0.15
Mocha

Mochacost()
0.20

Mochacost()0.20

tall
grandeventiBeverage
getSize()setSize()
0.100.150.20

public class Soy extends CondimentDecorator {


Beverage beverage;
public Soy(Beverage beverage) {
this.beverage = beverage;
}

tSize()
ge

public int getSize() {


return beverage.getSize();
}
public String getDescription() {
return beverage.getDescription() + , Soy;
}

public double cost() {


double cost = beverage.cost();
if (getSize() == Beverage.TALL) {
cost += .10;
} else if (getSize() == Beverage.GRANDE) {
cost += .15;
} else if (getSize() == Beverage.VENTI) {
cost += .20;
}
return cost;
}

107

...

OO

JoeSimUDuck

OO
Superclass

Duck

Quack
Swim

p
y
subt

lay()
p
dis

quack()
swim()
display()
//

MallardDuck

RedheadDuck

display() {

display() {

// }

// }

display()

Duck

Joe
JoeJoeOO
Duck

...

fly()
fly()
OO

Joe

Duck
quack()
swim()
display()

()
fly

MallardDuck

fly()

Joe

// ....

RedheadDuck

display() {

display() {

// }

// }

...

...
Joe

Monster.com
...

JoeDuck
JoeDuck

SimUDuck

..

reuse

Duck


()
fly

) )
y(
y(
fl
fl

MallardDuck

display() {
//
}

quack()
swim()
display()

fly()

//

RedheadDuck
display() {
//
}

RubberDuck
quack() {
//
}
display() {
//
}





c k ( )
q u a

queak
s

Joe

DecoyDuck

fly()

quack()

...

...
RubberDuck
quack() { // }
display() { // }

fly() {
//
}

DecoyDuck

quack() {
//
}

display() { // }
fly() {
//
}

Duck

A.

D.

B.

E.

C.

F.

Joe

fly()

Joe

Flyable

fly() quark()...

Quackable

Duck
Flyable
fly()

quack()

MallardDuck
display()
fly()
quack()

swim()
display()

Quackable

// ...

RedheadDuck
display()
fly()
quack()

DecoyDuck

RubberDuck
display()
quack()

display()

48Duck
!

J o e

FlyableQuackable

..

OO

...

EGNAHC

FlyableQuackable

FlyableJava

Duck

fly()quack()Duck
Duck

Duck
flyquack

Duckfly()quack()
DuckDuck

D u c k

10

FlyBehavior
QuackBehavior
FlyingQuacking
FlyBehaviorQuackBehavior
Duck

Duck

<<interface>>

FlyBehavior

fly()

FlyBehavior
QuackBehavior

FlyBehaviorQuakcBehavior

FlyWithWings
fly() {

FlyNoWay
fly() {

//
}

//
}

11



FlyBehavior

supertype

JavainterfaceJava
interface

AnimalDogCatAnimal

Dog d = new Dog();


d.bark();

Animal
makeSound()

d Do g

An im al


Animal animal = new Dog();
an im al

animal.makeSound();

Dog
makeSound() {
bark();
}
bark() { // }

12

Cat
makeSound() {
meow();
}
meow() { // }

new Dog()

a = getAnimal();
a.makeSound();

.. .

ma ke So un d( )

FlyBehaviorQuackBehavior

quack()

fly()

<<interface>>

<<interface>>

QuackBehavior

FlyBehavior

quack()

fly()

FlyWithWings
fly() {

FlyNoWay

//
}

Quack

fly() {

quack() {

//

// }

MuteQuack
quack() {

//

//

Squeak
quack() {

13

&

OO

Duck

...

Duck

Duck
Duck
Duck

SimUDuck

2 )
DuckCall

1)
FlyRocketPowered
FlyBehavior

14

delegate

flyBehavior
quackBehavior
FlyWithWings
Squeak...
Duckfly()quack()
FlyBehaviorQuackehavior
performFly()performQuack()Duckfly()quack()


y( )
fl
qu ac k( )


Duck
FlyBehavior flyBehavior
QuackBehavior quackBehavior
performQuack()
swim()
display()
performFly()
// ...

performQuack()

public class Duck {


QuackBehavior quackBehavior;
//

public void performQuack() {


quackBehavior.quack();
}

vior
QuackBeha

havior
quackBe

Duck quackBehavior
QuackBehavior

15

f l y B e h a v i o r
quackBehaviorMallardDuck
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}

MallardDuckDuck
flyBeh avior quac kBehav ior

}

ack
u
Q

()
ormQuack
f
r
e
p

uack
Q

hWings
t
i
W
y
l
F
or
FlyBehavi

public void display() {


System.out.println(Im a real Mallard duck);
}

MallardDuck
quackBehaviorQuack
QuackQuackBehavior
MallardDuck
flyBehaviorFlyWithWings
FlyWithWingsFlyBehavior

16

MallardDuck
DuckflyBehaviorquac
kBehavior

...

Quack

FlyWithWings

quackBehavior

QuickBehavior

17

Duck
1

DuckDuck.javaMallardDuck
MallardDuck.java
public abstract class Duck {

FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}

ck ag e
pa

public abstract void display();


public void performFly() {
flyBehavior.fly();
}

public void performQuack() {


quackBehavior.quack();
}

}
2

public void swim() {


System.out.println(All ducks float, even decoys!);
}

FlyBehavior
FlyBehavior.java
FlyWithWings.java FlyNoWay.java
public interface FlyBehavior {
public void fly();
}

public class FlyWithWings implements FlyBehavior {

public void fly() {

...

System.out.println(Im flying!!);

}
}

public class FlyNoWay implements FlyBehavior {


public void fly() {
System.out.println(I cant fly);
}
}

18

Duck ...
3

QuackBehavior QuackBehavior.java
Quack.javaMuteQuack.javaSqueak.java
public interface QuackBehavior {
public void quack();
}
public class Quack implements QuackBehavior {
public void quack() {
System.out.println(Quack);
}
}
public class MuteQuack implements QuackBehavior {
public void quack() {

System.out.println(<< Silence >>);
}
}
public class Squeak implements QuackBehavior {
public void quack() {

System.out.println(Squeak);
}
}

MiniDuckSimulator.java
public class MiniDuckSimulator {
public static void main(String[] args) {

Duck mallard = new MallardDuck();
r d D u c k
a
l
l
a
M
mallard.performQuack();

ck()
a
u
Q
m
r
o
f
mallard.performFly();
r

p e

}
r
o
i
v
a
Q u a c k B e h
k( )
}
av io r qu ac

eh
qu ac kB

()
ly
mF
or
rf
pe

File Edit Window Help Yadayadayada

%java MiniDuckSimulator
Quack

Im flying!!

19

setter method

Duck
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}

Duck
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;

public void setQuackBehavior(QuackBehavior qb) {


quackBehavior = qb;
}

swim()
display()
performQuack()
performFly()
setFlyBehavior()
setQuackBehavior()

//

ModelDuck.java
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();

quackBehavior = new Quack();
}

public void display() {


System.out.println(Im a model duck);
}

FlyBehavior
FlyRocketPowered.java

public class FlyRocketPowered implements FlyBehavior {


public void fly() {
System.out.println(Im flying with a rocket!);
}
}

20

MiniDuckSimulator.java

public class MiniDuckSimulator {


public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
Duck model = new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered());

model.performFly();

)
formFly(
r
e
p

ehavior
B
y
l
f

Way
o
N
y
l
F

setter

File Edit Window Help Yabadabadoo

%java MiniDuckSimulator
Quack

Im flying!!
I cant fly

Im flying with a rocket!

setter

21

Duck
FlyBehaviorQuackBehavior

SimUDuck

IS
-AHAS-A
IMPLEMENTS

<<interface>>

FlyBehavior

fly()

Duck

FlyWithWings

FlyBehavior flyBehavior
QuackBehavior quackBehavior

FlyNoWay

fly() {
//

swim()

// !

display()

fly() {
}

performQuack()
performFly()
setFlyBehavior()

setQuackBehavior()

<<interface>>

// ...

QuackBehavior

quack()

MallardDuck

RedheadDuck

RubberDuck

DecoyDuck

display() {

display() {

display() {

display() {

// }

// }

// }

// }

Quack
quack) {
}

22

Squeak
quack() {

//

MuteQuack
quack() {

//
}

// !
}

FlyBehavior

QuackBehavior

composition

...

..

duckcall

Duck

23

Strategy
PatternSimUDuck

24

...

1
1.

2.
2
3
3.

a. extend

b. implement

c.

4
4.
setWeapon()

Character

WeaponBehavior weapon;
fight();

fight() { ... }
fight() { ... }

BowAndArrowBehavior

KnifeBehavior

useWeapon() { //
}
<<interface>>

Queen

WeaponBehavior

useWeapon();

King
fight() { ... }
fight() { ... }

useWeapon() { //
}

Knight

Troll

AxeBehavior
useWeapon() { //
}

SwordBehavior

useWeapon() { //
}

setWeapon(WeaponBehavior w) {
this.weapon = w;
}

25

...
Alice
Flo

......

C.J.

Radio

Alice

FloAliceFloAlice

26

...

Rick

OO

Rick

...HelloWorld

...

27

28

. ..

API
Java API GUIIO

...

ated fly

Encapsul

behavior

>
<<interface> r
havio

FlyBe

fly()

FlyNoWay

gs

FlyWithWin
fly() {

{
display()
d}
a redhea
// looks like

Su
bje

int

ct Object

{
display()
}
a rubberduck
// looks like

MuteQuack

Squeak

Quack
quack) {
quacking
ents duck
// implem

{
display()
duck }
a decoy
// looks like

quack() {
k
duckie squea
// rubber

quack() {
quack!
g - cant
// do nothin
}

OBSERVER

8
8
8

Dog Object

ts

Duck

Duck

nt Objec

Mallard

{
display()
}
a mallard
// looks like

Rubber

vior

8
Duck Object

M ou

Automatic update/notification

Cat Object

se Object

Observers

r
ntrolle

Depende

Object that
holds state

or

ck behavi

>

<<interface>

QuackBeha

quack()

performFly()
r()
setFlyBehavio
avior()
setQuackBeh
methods...
duck-like
// OTHER

Decoy Duck

ated qua

Encapsul

display()
()
performQuack

Duck
Redhead

flying

swim()

ents duck

// implem

Duck

flyBehavior;
FlyBehavior
Behavior;
ior quack
QuackBehav

Client

fly() {
fly!
g - cant
// do nothin

MVC

Co

Model

est
Requ

View

API

29

OO...

...

OO
OO
OO
OO

OO

OO
...
...

30

...

OO

31

00

Java
t
s
r
d Fi

Hea

OO

OO

OO

32

OO
OO
OO


OO


OO

3
4
7

10

11

13

12

14

15
16
17
18

Across

Down

2. Grilled cheese with bacon


4. Duck demo was located where
7. _______ what varies
9. Most patterns follow from OO _______
14. Pattern that fixed the simulator
15. Patterns give us a shared _______
16. Design patterns _____
17. Development constant
18. Patterns ____ in many applications

1. High level libraries


3. Learn from the other guy's _______
5. Java IO, Networking, Sound
6. Program to this, not an implementation
8. Favor over inheritance
10. Duck that can't quack
11. Rick was thrilled with this pattern
12. Patterns go into your _______
13. Rubberducks make a ________

33

Character
KingQueenKnight
TrollWeapon

setWeapon()
Characterflight
useWeapon()

Character
WeaponBehavior weapon;
fight();
setWeapon(WeaponBehavior w) {
this.weapon = w;
}

fight() { ... }

King

fight() { ... }

Queen

fight() { ... }

WeaponBehavior

Knight

fight() { ... }

Troll
<<interface>>
WeaponBehavior
useWeapon();

SwordBehavior

useWeapon() { //
}

KnifeBehavior

avior
ponBeh
a
e
W

34

BowAndArrowBehavior

useWeapon() { //
}

useWeapon() { //
}

AxeBehavior

useWeapon() { //
}

Duck

A.

D.

B.

E.

C.

F.

35

13

...

577

578

context

579

...

OO

580

Pat
te
A- rns
C

Pat
te
D- rns
G

Pat
te
H- rns
N

Pat
te
O- rns
R

Pat
te
S- rns
Z

GammaHelm

JohnsonVlissides

Design Patterns: Elements

of Reusable Object-Oriented

S o f t w a r e A d d i s o n - W e s l e y

23

581

582

...

EJB

23

583


Intent
Motivation Applicability

584

SINGLETON

Object Creational

Intent
Et aliquat, velesto ent lore feuis acillao
rperci tat, quat nonsequam il ea at nim
nos do enim
qui eratio ex ea faci tet, sequis dion
utat, volore magnisi.

Motivation
Et aliquat, velesto ent lore feuis acillao
rperci tat, quat nonsequam il ea at nim
nos do enim
qui eratio ex ea faci tet, sequis dion
utat, volore magnisi.Rud modolore
dit laoreet augiam
iril el dipis dionsequis dignibh eummy
nibh esequat. Duis nulputem ipisim
esecte conullut
wissi.
Os nisissenim et lumsandre do con
el utpatuero corercipis augue doloreet
luptat amet vel
iuscidunt digna feugue dunt num etummy
nim dui blaor sequat num vel etue magna
augiat.
Aliquis nonse vel exer se minissequ
is do dolortis ad magnit, sim zzrillut
ipsummo dolorem

Applicability

Duis nulputem ipisim esecte conullut


wissiEctem ad magna aliqui blamet,
conullandre
dolore magna feuis nos alit ad magnim
quate modolore vent lut luptat prat.
Dui blaore min
ea feuipit ing enit laore magnibh eniat
wisissecte et, suscilla ad mincinci blam
dolorpe rcilit
irit, conse dolore dolore et, verci enis
enit ip elesequisl ut ad esectem ing
ea
con eros autem
diam nonullu tpatiss ismodignibh er.

Structure

Singleton
static uniqueInstance
// Other useful Singleton data...
static getInstance()
// Other useful Singleton methods...

Participants

Duis nulputem ipisim esecte conullut


wissiEctem ad magna aliqui blamet,
conullandre
dolore magna feuis nos alit ad magnim
quate modolore vent lut luptat prat.
Dui blaore min
ea feuipit ing enit laore magnibh eniat
wisissecte et, suscilla ad mincinci blam
dolorpe rcilit
irit, conse dolore dolore et, verci enis
enit ip elesequisl ut ad esectem ing
ea
con eros autem
diam nonullu tpatiss ismodignibh er

A dolore dolore et, verci enis enit ip


elesequisl ut ad esectem ing ea con
eros autem diam
nonullu tpatiss ismodignibh er
A feuis nos alit ad magnim quate
modolore vent lut luptat prat. Dui blaore
min ea
feuipit ing enit laore magnibh eniat
wisissec
Ad magnim quate modolore vent
lut luptat prat. Dui blaore min ea feuipit
ing enit

Collaborations

Feuipit ing enit laore magnibh eniat


wisissecte et, suscilla ad mincinci blam
dolorpe rcilit
irit, conse dolore.

Consequences

Duis nulputem ipisim esecte conullut

wissiEctem ad magna aliqui blamet,


conullandre:
1. Dolore dolore et, verci enis enit
ip elesequisl ut ad esectem ing ea con
eros autem
diam nonullu tpatiss ismodignibh er.
2. Modolore vent lut luptat prat. Dui
blaore min ea feuipit ing enit laore
magnibh
eniat wisissecte et, suscilla ad mincinci
blam dolorpe rcilit irit, conse dolore
dolore
et, verci enis enit ip elesequisl ut ad
esectem.
3. Dolore dolore et, verci enis enit
ip elesequisl ut ad esectem ing ea con
eros autem
diam nonullu tpatiss ismodignibh er.
4. Modolore vent lut luptat prat. Dui
blaore min ea feuipit ing enit laore
magnibh
eniat wisissecte et, suscilla ad mincinci
blam dolorpe rcilit irit, conse dolore
dolore
et, verci enis enit ip elesequisl ut ad
esectem.

Implementation/Sample Code

DuDuis nulputem ipisim esecte conullut


wissiEctem ad magna aliqui blamet,
conullandre
dolore magna feuis nos alit ad magnim
quate modolore vent lut luptat prat.
Dui blaore min
ea feuipit ing enit laore magnibh eniat
wisissecte et, suscilla ad mincinci blam
dolorpe rcilit
irit, conse dolore dolore et, verci enis
enit ip elesequisl ut ad esectem ing
ea con eros autem
diam nonullu tpatiss ismodignibh er.
public class Singleton {
private static Singleton

uniqueInstance;

// other useful instance


variables here

private Singleton() {}

public static synchroniz


ed Singleton getInstance()
{
if (uniqueInstance == null)
{
uniqueInstance = new Singleton(
);
}
return uniqueInstance;
}
}

// other useful methods


here

Nos alit ad magnim quate modolore


vent lut luptat prat. Dui blaore min
ea feuipit ing enit
laore magnibh eniat wisissecte et, suscilla
ad mincinci blam dolorpe rcilit irit,
conse dolore
dolore et, verci enis enit ip elesequisl
ut ad esectem ing ea con eros autem
diam nonullu
tpatiss ismodignibh er.

Known Uses

DuDuis nulputem ipisim esecte conullut


wissiEctem ad magna aliqui blamet,
conullandre
dolore magna feuis nos alit ad magnim
quate modolore vent lut luptat prat.
Dui blaore min
ea feuipit ing enit laore magnibh eniat
wisissecte et, suscilla ad mincinci blam
dolorpe rcilit
irit, conse dolore dolore et, verci enis
enit ip elesequisl ut ad esectem ing
ea con eros autem
diam nonullu tpatiss ismodignibh er.

DuDuis nulputem ipisim esecte conullut


wissiEctem ad magna aliqui blamet,
conullandre
dolore magna feuis nos alit ad magnim
quate modolore vent lut luptat prat.
Dui blaore min
ea feuipit ing enit laore magnibh eniat
wisissecte et, suscilla ad mincinci blam
dolorpe rcilit
irit, conse dolore dolore et, verci enis
enit ip elesequisl ut ad esectem ing
ea con eros autem
diam nonullu tpatiss ismodignibh er.
alit ad magnim quate modolore vent
lut luptat prat. Dui
blaore min ea feuipit ing enit laore
magnibh eniat wisissecte et, suscilla
ad mincinci blam
dolorpe rcilit irit, conse dolore dolore
et, verci enis enit ip elesequisl ut ad
esectem ing ea
con eros autem diam nonullu tpatiss
ismodignibh er.

Related Patterns

Elesequisl ut ad esectem ing ea con


eros autem diam nonullu tpatiss ismodigni
bh er. alit
ad magnim quate modolore vent lut
luptat prat. Dui blaore min ea feuipit
ing enit laore
magnibh eniat wisissecte et, suscilla
ad mincinci blam dolorpe rcilit irit,
conse dolore dolore
et, verci enis enit ip elesequisl ut ad
esectem ing ea con eros autem diam
nonullu tpatiss
ismodignibh er.

585

586

587

588

Abstract Factory
State

Decorator

Observer

Composite

Adapter

Factory Method

Command

Proxy
Iterator

Strategy

Singleton

Template Method
Facade

589

Singleton

Builder
Prototype

Abstract Factory

Interpreter

Observer
Chain of Responsibility
State
Strategy

Factory Method

Decorator
Flyweight

Composite

Proxy
Facade
Bridge

Adapter

590

Mediator
Visitor
Iterator
Command
Memento

Template Method

Template Method
Factory Method

Adapter

Interpreter

Visitor
Iterator
Command
Memento
Facade
Observer
Chain of Responsibility
Bridge
Mediator
State
Prototype
Flyweight
Composite

Decorator
Proxy
Strategy

Abstract Factory

Builder
Singleton

591

...

...

592

593

...

Keep It Simple / KISS

...
...

594

refactoring

595

...

Concurrent
System

596

HelloWorld

597

layer

598

599

600

Erich GammaRichard Helm

War d Cun ning ham K ent Bec k


Jim Cop lien G rady Boo ch Bru ce
And erso n Rich ard Gab riel Dou g
LeaPeter Coad Doug
Sch mid t

Ralph Johnson John Vlissides

...

Richard
Helm

Ralph
Johnson

John
Vlissides

Erich Gamma

601

...

...

1995

Head First

G o F

Christopher Alexander

The Timeless Way of Building


A Pattern Language

...

602

...

The Portland Patterns Repository

Ward Cunningham
WIKI
OO

http://c2.com/cgi/wiki?WelcomeVisitors

The Hillside Group

http://hillside.net/

Hillside

OOPSLA OOPSLA ACM


OO

603

...

We b

MV C

concurrent

604

J2EE

GU I

605

606

Web

tern
land Pat
t
r
o
P

ik i
W

ry
o
t
si
Repo

2 .c o m /
h t t p :/ /c
W ik i
607

OO
O O

o-midaenayanln
O O
n ueast
deitvion

rhyndae-Pd--tDro
th
finesoao
t

ly
tthau
o
c asje
aq
u
nt,aaq

etritss
re
th
oue.ef

sq
sm
Fera-
Act
te
ed
ltlly
atsiloaore
tdM
ts
vaaerctyr-o
b
cte
ucfa
ic
cie
ro
bgtbd
p
re
cm
ago
asstje
cp
n
la
je
nb
naesbn
O
ola
n
u
uteus.
bscesotrdm
y
E

e
-e
s
E
in
n
in
oo
o

AFb
t
c
a
o

a
c
tw
n
e
s

a
n
p
n
l

e
je
it
c
E
y
a
o
a

b
ll
r
D
t
n
b
ti
in
r
w

g
y

y
a
u
c
o
,
t
E
a
c
n
r
o
m
lo
e
n
t
o
g
le

te
ttifo-fo
a paro
g
g
eib
ata
in

Arsto
cllre
p
chhslesatotg

titib
eh
ed
sc
tcte
o
le
a
in
w
s
n
cnili
ee
id
b
la

e
a
y
e
e
C

S
v
le
ts
t
d
ta
e
e
fa
c
x
s
p
g
l
y
h
c
A
e

ein
a
a
n
t
je
b
e
ic
r
s
drein
F
t

e
b
rn
d
r
S
n
e
h
r
,
a
o
n
o
c
te
h
t
w
t

e
te
a
re
n
t
p
nsid
inee duitphh
s neoin
cje
itvch
,et
je
chsec
ed
ton
es.nittts ___
eegre
i
o
sle
p
ts
red
d
s
bbb
d
n
i
w
ate
la

d
d
eep
in

c
had
s
oro
io
nre
snrerje
cd
eit
aarb
oela
o
nacosetovta
w
n
a
t
dn

s
la
n
h
d
to
w
ts
h
te
h
a
e
r
t
te
s
.
a
x

a
ts
w
fi
c
a
e
it
b
r
ti
e
u
n
n
o

li
s
M
re
o
e
o
p
fo
c
t
c
o

,
t
y
li
n
_n_dd___
g
p
e
e

ri
r

c
le
_
ts
s
z
a
a
ir
eilclst

stte
sin
as
D oefna
e
,aen
eto
ts
ss_ts
riFw
h
la
cm
tre
n
cza
eeje
q
te
g
uu_ete_o
.tb
t_h
ra
d
_q_n
ecu
_io
bia
_gg_re
ifra
ein
re
t
_tia
prn
ca
etinceyo
vm

o
_rlo
eath
daseltin
r
p
e
t
s.
a
lo
T
pp

s
o
u
e
y

n
e
n
t
e

ll
u
q
a
,
io
a
u

a
e
t

ts.ic
tstsfe
. s
,q
aesed
ee_rr_a_t_io
ryuin
_n_s_._____

o
u
t
p
_
s
q
m
li
u
p
a

o
e
a
u
t
o
n
le
q
re
s
la
b
_
le
io
s
re
o
c
t
_
a
b
d
nndoa_____
fuancsla
ttsuu.
oorre
up
_____
susbucpplapss
________
________

608

...

Head First

... email
booksuggestions@wickedlysmart.com

609

610

You might also like