Professional Documents
Culture Documents
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() {
//
}
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
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
Animal
makeSound()
dDog
Animal
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
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()
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
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();
}
}
2
FlyBehaviorFlyBehavior.java
FlyWithWings.javaFlyNoWay.java
public interface FlyBehavior {
public void 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
quack()
performFly()
%java MiniDuckSimulator
Quack
Im flying!!
19
setter method
1 Duck
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}
Duck
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
swim()
display()
performQuack()
performFly()
setFlyBehavior()
setQuackBehavior()
//
ModelDuck.java
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
}
3
FlyBehavior
FlyRocketPowered.java
20
MiniDuckSimulator.java
model.performFly();
mFly()
or
rf
pe
lyNoWay
F
r
o
i
v
a
h
e
B
fly
sett
er
%java MiniDuckSimulator
Quack
Im flying!!
I cant fly
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()
A.
D.
E.
B.
F. WeatherData
C.
42
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
update()
Mary
Sue
DisplayElement
display()
MarySue
57
WeatherData
import
package
WeatherData
wickedlysmart
URL
xxxv
Subject
ist
ArrayL
ArrayList
ArrayList
ArrayList
update()
58
WeatherData
Subject
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
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
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);
}
}
%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 =
HeatIndexDisplay.java
heatindex.txt
heatindex.txtwickedlysmart.com
Head First
Google
%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
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() { }
notifyObservers();
}
notifyObservers()
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
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)
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
%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
%java SwingObserverExample
72
JButton
JFrameinnerAclass
SwingSwing
Head First JavaGUI
Swing
JFrame
}
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
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
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
va
up da te (O bs er
pu bl ic vo id
{
g)
ar
ct
je
Ob
le ,
bl e ob se rv ab
}
}
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
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() {
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
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
zz
end
eBl
s
u
Ho
Coffee
94
tarbuzz
Starbu
.89
.99
1.05
1.99
.10
.20
.15
.10
Beverage
ge
ra
ve
Be
cost()
ip-tion()
getDescr
getDescription()
cost()
BeverageCondiment
ecorator
Condiment D
Condimen
rage
e
v
e
B
age
Bever
Decorator
getDescription()
95
Espresso
cost()
presso
Es
Espresso
Beverage
description
Beverage
Espresso
Espresso
$1.99
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)
this.beverage = beverage;
Mocha
Mocha
DarkRoast
DarkRoast, Mocha
Mocha
SoyWhip
97
spresso
E
DarkRoast
Mocha
Mocha
% 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()
.io
java
FilterInputStream
InputStream
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
in.close();
} catch (IOException e) {
e.printStackTrace();
}
test.txt file
% 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
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
tSize()
ge
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
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()
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
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
}
2
FlyBehavior
FlyBehavior.java
FlyWithWings.java FlyNoWay.java
public interface FlyBehavior {
public void fly();
}
...
System.out.println(Im flying!!);
}
}
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
%java MiniDuckSimulator
Quack
Im flying!!
19
setter method
Duck
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}
Duck
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
swim()
display()
performQuack()
performFly()
setFlyBehavior()
setQuackBehavior()
//
ModelDuck.java
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
FlyBehavior
FlyRocketPowered.java
20
MiniDuckSimulator.java
model.performFly();
)
formFly(
r
e
p
ehavior
B
y
l
f
Way
o
N
y
l
F
setter
%java MiniDuckSimulator
Quack
Im flying!!
I cant fly
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
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
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
Structure
Singleton
static uniqueInstance
// Other useful Singleton data...
static getInstance()
// Other useful Singleton methods...
Participants
Collaborations
Consequences
Implementation/Sample Code
uniqueInstance;
private Singleton() {}
Known Uses
Related Patterns
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
...
...
...
594
refactoring
595
...
Concurrent
System
596
HelloWorld
597
layer
598
599
600
...
Richard
Helm
Ralph
Johnson
John
Vlissides
Erich Gamma
601
...
...
1995
Head First
G o F
Christopher Alexander
...
602
...
Ward Cunningham
WIKI
OO
http://c2.com/cgi/wiki?WelcomeVisitors
http://hillside.net/
Hillside
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