Professional Documents
Culture Documents
/G"#$ %0 1% r2 De-i$# P"tter#G"&&"3 4el&3 5%h#-%#3 6li--i!eCrea!ional ( s!rac! )ac!or" Buil#er )ac!or" Me!ho# *ro!o!"pe Sin%le!on S!ruc!ural (#ap!er Bri#%e Composi!e +ecora!or )aca#e )l",ei%h! *ro-" Behavioral Chain of Responsi Comman# $n!erpre!er Me#ia!or Memen!o O server S!a!e S!ra!e%" &empla!e Me!ho# 'isi!or
ili!"
he !esign "atterns solution is to turn the programmer into a fancy macro processor - #. $. !ominus, !esign "atterns Aren%t
At code level, most design patterns are code smells. - &tuart 'alloway
(eginning developers never met a pattern or an ob)ect they didn%t li*e. Encouraging them to experiment with patterns is li*e throwing gasoline on a fire. - $eff Atwood, Coding 'orror
Pr"ctic"l P"tter#...form a lan%ua%e or voca ular" ...e-pose real issues ...help us compare #esi%n choices
A$e#!"
Si#$let%# &empla!e Me!ho# *ro-" 'isi!or
50
55
Si#$let%# h"- i-- e6i##en couplin% &es!in% Jus! one7 $!1s a lie. 8volu!ion *ossi le memor" lea/ Su classin% $ni!iali9a!ion or#er an# #epen#encies
52
53
5.
50
52
53
A$e#!"
Sin%le!on Te&pl"te Meth%! *ro-" 'isi!or
58
54
20
25
22
Te&pl"te Meth%! h"- i-- e*oorl" #ocumen!s in!en! !o frame,or/ user *u lic vs pro!ec!e# vs a s!rac! me!ho#s )rom #ifferen! levels of inheri!ance hierarch" (l%ori!hm an# or#er of calls Relies on inheri!ance Ma/es composi!ion of func!ionali!" #ifficul! 6ar# !o main!ain an# evolve $nheri!ance hierarch" ma/e comple!el" rea/ #o,n
23
2.
20
22
23
A$e#!"
Sin%le!on &empla!e Me!ho# Pr%x9 'isi!or
28
24
30
Pr%8le&: Te!i% - t% ;rite "#! &"i#t"i# -t"tic pr%x9 cl"--epublic class Ca+e-an"ler i&ple&ents Invocation-an"ler { private Ca+e ca+e; public b!ect invo+e( b!ect pro4$9 /et'o" &et'o"9 b!ect:; args) t'rows T'rowable { if(ca+e == null) { ca+e = new C'ocolateCa+e(); } if(&et'o"(getNa&e()(e<uals(=eat>)) { ca+e(eat(); return null; } else { return &et'o"(invo+e(&et'o"9 args); }
Pr%8le&: Te!i% - t% ;rite "#! &"i#t"i# -t"tic pr%x9 cl"--eS%l ti%# B): AOP S%l ti%# BC: C%!e $e#er"ti%# Left as an exercise for the reader.... :)
32
33
3.
A$e#!"
Sin%le!on &empla!e Me!ho# *ro-" 6i-it%r
30
32
33
I&ple&e#ti#$ 6i-it%r
public interface 1isitable { voi" accept1isitor(1isitor visitor); } public interface 1isitor { voi" visit(ConcreteNo"e6 no"e6); ## repeat for all concrete no"es } public class ConcreteNo"e6 i&ple&ents 1isitable { public voi" accept1isitor(1isitor visitor) { visitor(visit(t'is); } } public class Concrete1isitor i&ple&ents 1isitor { ## ((( }
2008 JavaOneSM Conference | java.sun.com/javaone | 38
34
C%&&%# 6i-it%r T9peACollec!orB visi!or Collec! an# accumula!e for re!urn A)in#erB visi!or Re!urn imme#ia!el" ,hen ma!ch foun# A8ven!B visi!or S!a!eless: fire even!s for su se! of no#es A&ransformB visi!or Mo#if" !he !ree ,hile ,al/in% i! *o!en!iall" #an%erous =@ A'ali#a!ionB visi!or 'erifies !he s!ruc!ure an# repor!s pro lems
2008 JavaOneSM Conference | java.sun.com/javaone | .3
## e4a&ple use ConcreteNo"e root = ((( Concrete1isitor v = new Concrete1isitor(); ?ist@String5 conte4t = new Arra$?ist@String5(); root(accept1isitor(v9 conte4t);
Pr%8le&: Excepti%#public class E4ceptional1isitor e4ten"s %ase1isitor { private /$E4ception e4ception; private E4ceptional1isitor() {} public voi" c'ec+Error() t'rows /$E4ception { if(t'is(e4ception ,= null) { t'row e4ception; } } public static voi" run(No"e root) t'rows /$E4ception { E4ceptional1isitor visitor = new E4ceptional1isitor(); root(accept1isitor(visitor); c'ec+Error(); }
Pr%8le&: Excepti%#public interface 1isitable { @E e4ten"s E4ception5 voi" accept1isitor(1isitor@E5 visitor) t'rows E; } public interface 1isitor@E e4ten"s E4ception5 { voi" visit(ConcreteNo"e6 no"e6) t'rows E; ## for all concrete no"es } public class ConcreteNo"e6 i&ple&ents 1isitable { @E e4ten"s E4ception5 public voi" accept1isitor(1isitor@E5 visitor) t'rows E { visitor(visit(t'is); } }
.4
D9#"&ic6i-it%r 8 ilt 0r%& cl%- republic class C$na&ic1isitor i&ple&ents 1isitor { private {ConcreteNo"e6==5voi"} concreteNo"e6%loc+; private {ConcreteNo"e7==5voi"} concreteNo"e7%loc+; private {Co&positeNo"e==5voi"} co&positeNo"e%loc+; public voi" a""ConcreteNo"e6( {ConcreteNo"e6==5voi"} bloc+) { t'is(concreteNo"e6%loc+ = bloc+; } public voi" visit(ConcreteNo"e6 no"e) { if(concreteNo"e6%loc+ ,= null) { concreteNo"e6%loc+(invo+e(no"e); } } } (((
00
6i-it%r( il!er
public class 1isitor%uil"er { public static 1isitor%uil"er visitor() { return new 1isitor%uil"er(); } private C$na&ic1isitor visitor = new C$na&ic1isitor(); public 1isitor%uil"er 'an"leConcreteNo"e6( {ConcreteNo"e6==5voi"} bloc+) { visitor(a""ConcreteNo"e6(bloc+); return t'is;
05
A--e&8le
public class Test2in"er { public static No"e fin"/atc'(String na&e9 No"e root) { 1isitor visitor = 1isitor%uil"er(visitor() ('an"leConcreteNo"e6({ConcreteNo"e6 no"e ==5 if(no"e(getNa&e()(e<uals(na&e)) { return no"e; } }) ('an"leConcreteNo"e7({ConcreteNo"e7 no"e ==5 if(no"e(getNa&e()(e<uals(na&e)) { return no"e; } }) (buil"(); root(accept(visitor); return null; } }
2008 JavaOneSM Conference | java.sun.com/javaone | 02
03
De-i$# Pri#cipleFse in!erfaces an# #epen#enc" injec!ion !o re#uce couplin% )avor composi!ion over inheri!ance Separa!e lo%ic !ha! ,ill evolve a! #ifferen! ra!es Rel" on o jec! i#en!i!" as li!!le as possi le Gevera%e s!a!ic !"pin% an# %enerics
0.
S &&"r9
+esi%n pa!!erns are a valua le !ool !o #escri e real pro%rammin% pro lems. Solu!ions !o all #esi%n pro lems are con!e-!ual ?#epen#en! on lan%ua%e: !he co#e ase: an# !he #evelopers !hemselves@. Fse #esi%n pa!!erns as a s!ar!in% !o poin! !o #iscuss al!erna!ives. +on1! s!op a! an e-ample from a oo/ or a lo% or even a JavaOne even! presen!a!ion. =@ 8-perimen! !o fin# ,ha! ,ill ,or/ es! for "ouH
2008 JavaOneSM Conference | java.sun.com/javaone | 00
02