Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 149

Projektni obrasci..................................................................................................................5 Kreacioni obrasci (Creational Patterns)...............................................................................7 Apstraktna fabrika (Abstract Factory) ............................................................................7 Definicija......................................................................................................................7 UML ija!ra" klasa....................................................................................................

7 #le"enti.......................................................................................................................$ Pri"er ko a % je&ik% C'(.............................................................................................$ )ra itelj (*%il er)..........................................................................................................+5 Definicija....................................................................................................................+5 UML Dija!ra" klasa.................................................................................................+5 #le"enti.....................................................................................................................+5 Pri"er ko a % je&ik% C'(...........................................................................................+, Fabri-ki "eto (Factory Met.o )................................................................................../0 Definicija..................................................................................................................../0 UML Dija!ra" klasa................................................................................................./0 #le"enti...................................................................................................................../0 Pri"er ko a % je&ik% C'(.........................................................................................../1 Pri"er i& st2arno! s2eta............................................................................................./5 Prototip (Prototype)......................................................................................................./3 Definicija..................................................................................................................../3 UML Dija!ra" klasa................................................................................................./3 #le"enti...................................................................................................................../3 Pri"er ko a % je&ik% C'(...........................................................................................04 Pri"er i& st2arno! s2eta.............................................................................................0+ Usa"ljenik (5in!leton)..................................................................................................05 Definicija....................................................................................................................05 UML Dija!ra" klasa.................................................................................................05 #le"enti.....................................................................................................................05 Pri"er ko a % je&ik% C'(...........................................................................................05 Pri"er i& st2arno! s2eta.............................................................................................0, 5tr%kt%rni obrasci (5tr%ct%ral Patterns).............................................................................03 Pre!o2ara- (A apter).....................................................................................................03 Definicija....................................................................................................................03 UML Dija!ra" klasa.................................................................................................03 #le"enti.....................................................................................................................03 Pri"er ko a % je&ik% C'............................................................................................14 Pri"er i& st2arno! s2eta.............................................................................................1+ Most (*ri !e).................................................................................................................15 Definicija....................................................................................................................15 UML Dija!ra" klasa.................................................................................................15 #le"enti.....................................................................................................................15 Pri"er ko a % je&ik% C'............................................................................................1, Pri"er i& st2arno! s2eta.............................................................................................1$ Ko"po&icija (Co"posite)..............................................................................................5/ Definicija....................................................................................................................5/ UML Dija!ra" klasa.................................................................................................5/

#le"enti.....................................................................................................................5/ Pri"er ko a % je&ik% C'(...........................................................................................50 Pri"er i& st2arno! s2eta.............................................................................................5, Dekorater (Decorator)....................................................................................................53 Definicija....................................................................................................................53 UML Dija!ra" klasa.................................................................................................53 #le"enti.....................................................................................................................53 Pri"er ko a % je&ik% C'............................................................................................,4 Pri"er i& st2arno! s2eta.............................................................................................,/ Fasa a (Fa6a e).............................................................................................................,, Definicija....................................................................................................................,, UML Dija!ra" klasa.................................................................................................,, #le"enti.....................................................................................................................,, Pri"er ko a % je&ik% C'............................................................................................,7 Pri"er i& st2arno! s2eta.............................................................................................,3 5%perlaki (Fly7ei!.t) ...................................................................................................7/ Definicija....................................................................................................................7/ UML Dija!ra" klasa.................................................................................................7/ #le"enti.....................................................................................................................7/ Pri"er ko a % je&ik% C'............................................................................................70 Pri"er i& st2arno! s2eta.............................................................................................75 Poslanik (Pro8y).............................................................................................................73 Definicija....................................................................................................................73 UML Dija!ra" klasa.................................................................................................73 #le"enti.....................................................................................................................73 Pri"er ko a % je&ik% C'............................................................................................$4 Pri"er i& st2arno! s2eta.............................................................................................$+ 9brasci pona:anja (*e.a2ioral Patterns)...........................................................................$0 Ko"an ni lanac (C.ain of ;esponsibility)....................................................................$0 Definicija....................................................................................................................$0 UML Dija!ra" klasa.................................................................................................$0 #le"enti.....................................................................................................................$0 Pri"er ko a % je&ik% C'(...........................................................................................$1 Pri"er i& st2arno! s2eta.............................................................................................$, Ko"an a (Co""an )....................................................................................................$3 Definicija....................................................................................................................$3 UML Dija!ra" klasa.................................................................................................$3 #le"enti.....................................................................................................................$3 Pri"er ko a % je&ik% C'............................................................................................34 Pri"er i& st2arno! s2eta.............................................................................................3+ <nterpretator (<nterpreter)...............................................................................................35 Definicija....................................................................................................................35 UML Dija!ra" klasa.................................................................................................35 #le"enti.....................................................................................................................35 Pri"er ko a % je&ik% C'............................................................................................3, Pri"er i& st2arno! s2eta.............................................................................................37

*roja- (<terator)...........................................................................................................+4+ Definicija..................................................................................................................+4+ UML Dija!ra" klasa...............................................................................................+4+ #le"enti...................................................................................................................+4+ Pri"er ko a % je&ik% C'..........................................................................................+4/ Pri"er i& st2arno! s2eta...........................................................................................+41 Posre nik (Me iator)...................................................................................................+47 Definicija..................................................................................................................+47 UML Dija!ra" klasa...............................................................................................+47 #le"enti...................................................................................................................+47 Pri"er ko a % je&ik% C'..........................................................................................+47 Pri"er i& st2arno! s2eta...........................................................................................++4 Po se=anje (Me"ento).................................................................................................++0 Definicija..................................................................................................................++0 UML Dija!ra" klasa...............................................................................................++0 #le"enti...................................................................................................................++0 Pri"er ko a % je&ik% C'..........................................................................................++1 Pri"er i& st2arno! s2eta...........................................................................................++5 >a &ornik (9bser2er)..................................................................................................++3 Definicija..................................................................................................................++3 UML Dija!ra" klasa...............................................................................................++3 #le"enti...................................................................................................................++3 Pri"er ko a % je&ik% C'..........................................................................................+/4 Pri"er i& st2arno! s2eta...........................................................................................+// 5tanje (5tate)................................................................................................................+/5 Definicija..................................................................................................................+/5 UML Dija!ra" klasa...............................................................................................+/5 #le"enti...................................................................................................................+/5 Pri"er ko a % je&ik% C'..........................................................................................+/5 Pri"er i& st2arno! s2eta...........................................................................................+/7 5trate!ija (5trate!y).....................................................................................................+00 Definicija..................................................................................................................+00 UML Dija!ra" klasa...............................................................................................+00 #le"enti...................................................................................................................+00 Pri"er ko a % je&ik% C'..........................................................................................+01 Pri"er i& st2arno! s2eta...........................................................................................+05 ?ablonski "eto (@e"plate Met.o )...........................................................................+0$ Definicija..................................................................................................................+0$ UML Dija!ra" klasa...............................................................................................+0$ #le"enti...................................................................................................................+0$ Pri"er ko a % je&ik% C'..........................................................................................+0$ Pri"er i& st2arno! s2eta...........................................................................................+14 Posetilac (Aisitor)........................................................................................................+10 Definicija..................................................................................................................+10 UML Dija!ra" klasa...............................................................................................+10 #le"enti...................................................................................................................+10

Pri"er ko a % je&ik% C'..........................................................................................+11 Pri"er i& st2arno! s2eta...........................................................................................+17

Projektni obrasci
Projektni obrasci su reenja za najee probleme na koje se nailazi u toku razvijanja softvera. Obrasci najee slue da unaprede dizajn i mogunost interagovanja meu objektima, a takoe unapreuju i komunikaciju meu objektima nudei elegantna, ponovno upotrebljiva reenja za najoptije programerske izazove. akozvani Gang of Four !"o#$ obrasci, koji e ovde biti opisani, predstavljaju osnovu za sve ostale obrasce. Oni su kategorisani u tri grupe% kreacioni, strukturni i obrasci ponaanja. &a bi ovi obrasci bili bolje s'vaeni svaki od nji' je predstavljen !preko () koda$ i kao strukturni i kao primer iz stvarnog sveta. Primer iz stvarnog sveta predstavlja upotrebu obrasca u nekoj situaciji veoma bliskoj realnoj. Kreacioni obrasci (Creational Patterns) *pstraktna fabrika !Abstract Factory$ "raditelj !Builder$ #abriki metod !Factory Method$ Prototip !Prototype$ ,samljenik !Singleton$ +reira instane nekoliko familija klasa

Odvaja kreiranje objekata od njegovog predstavljanja

+reira instance razliiti' izvedeni' klasa

Potpuno inicijalizovana instanca koja moe biti kopirana ili klonirana

+lasa koja moe imati samo jedan ivi objekat.

Strukturni obrasci (Structural Patterns) Pregovara !Adapter$ -ost !Bridge$ +ompozicija !Composite$ &ekorater Obezbeuje interfejs izmeu razliiti' klasa

.azdvaja interfejs nekog objekta od njegove implementacije .ealizuje strukturu stabla u koju mogu da se smeste i prosti i sloeni objekti. &inamiki dodaje uloge objektima.

!Decorator$ #asada !Facade$ 0uperlaki !Flyweight$ Poslanik !Proxy$ /edna klasa koja predstavlja ceo podsistem. /ednostavnija instanca neke klase koja se kreira u cilju efikasnijeg deljenja ili slanja Objekat koji reprezentuje neki drugi objekat

Obrasci ponaanja (Behavioral Patterns) +omandni lanac !Chain of Resp $ +omanda !Command$ uma !!nterpreter$ 2roja !!terator$ Posrednik !Mediator$ Podseanje !Memento$ 4adzornik !"bser#er$ 0tanje !State$ 0trategija !Strategy$ 5ablonski metod !$emplate Method$ Posetilac !%isitor$ Prosleivanje za'teva kroz lanac objekata

1nkapsulacija komandne u objekat

,kljuivanje elemenata jezika u program.

0ekvencijalni pristup elementima kolekcije.

&efinisanje uproene komunikacije meu klasama

3raanje objekta u preanje stanje

Prosleivanje informacije o nekoj promeni objektima veeg broja klasa

-enjanje ponaanja nekog objekta u zavisnosti od promene stanja

1nkapsuliranje algoritma unutar klase

&efinisanje konkretni' algoritamski' koraka koji se razlikuju u potklasama

&efinisanje nove operacije u klasi bez njene ekspilicitne promene

Kreacioni obrasci (Creational Patterns)

Apstraktna fabrika (Abstract Factory)


Definicija
Obezbeuje interfejs za kreiranje familije povezani' i meusobno zavisni' objekata bez specificiranja nji'ovi' konkretni' klasa.

U ! "ijagra# klasa

$le#enti
+lase i6ili objekti koje uestvuju u ovom obrascu su% %bstractFactor& (ContinentFactor&) o deklarie interfejs za operacije koje kreiraju odreene apstraktne objekte

ConcreteFactor& (%fricaFactor&' %#ericaFactor&) o implemetira operacije za kreiranje odreene vrste konkretni' objekata

%bstractPro"uct ((erbi)ore' Carni)ore) o deklarie interfejs za odreenu vrstu objekata

Pro"uct (*il"ebeest' !ion' Bison' *olf) o definie objekat koji e biti kreiran u skladu sa odgovarajuom (oncrete#actor7 klasom o implementira interfejs koji definie klasa *bstractProduct

Client (%ni#al*orl") o +orisniki interfejs ka klasama *bstract#actor7 i *bstractProduct

Pri#er ko"a u je+iku C,0ledei strukturni kod prikazuje obrazac *bstract #actor7 kako kreira paralelne 'ijerar'ije objekata. +reiranje objekata je uraeno na apstraktnom nivou tako da nije potrebno upisivati imena klasa u korisnikom kodu.
// Abstract Factory -- Strukturni primer using System; namespace DoFactory.GangOfFour.Abstract.Structural { // MainApp test aplikaci a class MainApp { public static !oi" Main#$ { // Abstract factory %& AbstractFactory factory& ' ne( )oncreteFactory&#$; )lient c& ' ne( )lient#factory&$; c&.*un#$; // Abstract factory %+ AbstractFactory factory+ ' ne( )oncreteFactory+#$; )lient c+ ' ne( )lient#factory+$;

c+.*un#$; // ,ait for user input )onsole.*ea"#$; // .AbstractFactory. abstract class AbstractFactory { public abstract Abstract/ro"uctA )reate/ro"uctA#$; public abstract Abstract/ro"uct0 )reate/ro"uct0#$; // .)oncreteFactory&. class )oncreteFactory& 1 AbstractFactory { public o!erri"e Abstract/ro"uctA )reate/ro"uctA#$ { return ne( /ro"uctA&#$; public o!erri"e Abstract/ro"uct0 )reate/ro"uct0#$ { return ne( /ro"uct0&#$; // .)oncreteFactory+. class )oncreteFactory+ 1 AbstractFactory { public o!erri"e Abstract/ro"uctA )reate/ro"uctA#$ { return ne( /ro"uctA+#$; public o!erri"e Abstract/ro"uct0 )reate/ro"uct0#$ { return ne( /ro"uct0+#$; // .Abstract/ro"uctA. abstract class Abstract/ro"uctA { // .Abstract/ro"uct0. abstract class Abstract/ro"uct0 { public abstract !oi" 2nteract#Abstract/ro"uctA a$;

// ./ro"uctA&. class /ro"uctA& 1 Abstract/ro"uctA { // ./ro"uct0&. class /ro"uct0& 1 Abstract/ro"uct0 { public o!erri"e !oi" 2nteract#Abstract/ro"uctA a$ { )onsole.,rite3ine#t4is.Get5ype#$.6ame 7 . interacts (it4 . 7 a.Get5ype#$.6ame$; // ./ro"uctA+. class /ro"uctA+ 1 Abstract/ro"uctA { // ./ro"uct0+. class /ro"uct0+ 1 Abstract/ro"uct0 { public o!erri"e !oi" 2nteract#Abstract/ro"uctA a$ { )onsole.,rite3ine#t4is.Get5ype#$.6ame 7 . interacts (it4 . 7 a.Get5ype#$.6ame$; // .)lient. class )lient { pri!ate Abstract/ro"uctA Abstract/ro"uctA; pri!ate Abstract/ro"uct0 Abstract/ro"uct0; // )onstructor public )lient#AbstractFactory factory$ { Abstract/ro"uct0 ' factory.)reate/ro"uct0#$; Abstract/ro"uctA ' factory.)reate/ro"uctA#$; public !oi" *un#$ { Abstract/ro"uct0.2nteract#Abstract/ro"uctA$; -

8zlaz
/ro"uct0& interacts (it4 /ro"uctA& /ro"uct0+ interacts (it4 /ro"uctA+

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta ili real&world code opisuje stvaranje razliiti' ivotinjski' svetova za npr. neku igricu korienjem razliiti' fabrika. 2ez obzira to su kreirane ivotinje razliite u zavisnosti od kontinenta, interakcija meu njima ostaje ista.

// Abstract Factory -- /rimer i8 st!arnog s!eta using System; namespace DoFactory.GangOfFour.Abstract.*eal,orl" { // MainApp test aplikaci a class MainApp { public static !oi" Main#$ { // )reate an" run t4e Africa animal (orl" )ontinentFactory africa ' ne( AfricaFactory#$; Animal,orl" (orl" ' ne( Animal,orl"#africa$; (orl".*unFoo")4ain#$; // )reate an" run t4e America animal (orl" )ontinentFactory america ' ne( AmericaFactory#$; (orl" ' ne( Animal,orl"#america$; (orl".*unFoo")4ain#$; // ,ait for user input )onsole.*ea"#$; // .AbstractFactory. abstract class )ontinentFactory { public abstract 9erbi!ore )reate9erbi!ore#$;

public abstract )arni!ore )reate)arni!ore#$; // .)oncreteFactory&. class AfricaFactory 1 )ontinentFactory { public o!erri"e 9erbi!ore )reate9erbi!ore#$ { return ne( ,il"ebeest#$; public o!erri"e )arni!ore )reate)arni!ore#$ { return ne( 3ion#$; // .)oncreteFactory+. class AmericaFactory 1 )ontinentFactory { public o!erri"e 9erbi!ore )reate9erbi!ore#$ { return ne( 0ison#$; public o!erri"e )arni!ore )reate)arni!ore#$ { return ne( ,olf#$; // .Abstract/ro"uctA. abstract class 9erbi!ore { // .Abstract/ro"uct0. abstract class )arni!ore { public abstract !oi" :at#9erbi!ore 4$; // ./ro"uctA&. class ,il"ebeest 1 9erbi!ore { // ./ro"uct0&. class 3ion 1 )arni!ore {

public o!erri"e !oi" :at#9erbi!ore 4$ { // :at ,il"ebeest )onsole.,rite3ine#t4is.Get5ype#$.6ame 7 . eats . 7 4.Get5ype#$.6ame$; // ./ro"uctA+. class 0ison 1 9erbi!ore { // ./ro"uct0+. class ,olf 1 )arni!ore { public o!erri"e !oi" :at#9erbi!ore 4$ { // :at 0ison )onsole.,rite3ine#t4is.Get5ype#$.6ame 7 . eats . 7 4.Get5ype#$.6ame$; // .)lient. class Animal,orl" { pri!ate 9erbi!ore 4erbi!ore; pri!ate )arni!ore carni!ore; // )onstructor public Animal,orl"#)ontinentFactory factory$ { carni!ore ' factory.)reate)arni!ore#$; 4erbi!ore ' factory.)reate9erbi!ore#$; public !oi" *unFoo")4ain#$ { carni!ore.:at#4erbi!ore$; -

8zlaz
3ion eats ,il"ebeest ,olf eats 0ison

Graditelj (Builder)

Definicija
.azdvaja kreiranje sloeni' objekata od nji'ove reprezentacije tako da se za isti proces konstruisanja mogu kreirati razliite reprezentacije.

U ! Dijagra# klasa

$le#enti
+lase i6ili objekti koje uestvuju u ovom obrascu su% Buil"er (.e/icleBuil"er) o specificira apstraktni interfejs za kreiranje delova objekata klase Product.

ConcreteBuil"er ( otorC&cleBuil"er' CarBuil"er' ScooterBuil"er) o kreira i sklapa delove objekta one klase koja implementira interfejs definisan od strane klase 2uilder o o vodi rauna o objektima koje kreira obezbeuje interfejs za pribavljanje objekata klase Product

Director (S/op) o konstruie objekte na osnovu interfejsa koji obezbeuje klasa 2uilder

Pro"uct (.e/icle) o predstavlja sloeni objekat koji treba kreirati. +lasa (oncrete2uilder kreira internu reprezentaciju objekata klase Product i definie postupke na osnovu koji' se oni sklapaju.

ukljuuje klase koje definiu delove objekta koji treba kreirati, ukljuujui i interfejs za za sklapanje njegovi' delova u finalni objekat

Pri#er ko"a u je+iku C,0ledei strukturni kod pokazuje upotrebu obrasca 2uilder gde se kreiraju sloeni objekti korak9po9 korak. Proces kreiranja objekata se moe razlikovati od jedne do druge reprezentacije objekta, i bitno je napomenuti da ovaj obrazac obezbeuje kontrolu sklapanja delova objekta na viem nivou.
// 0uil"er pattern -- Strukturni primer using System; using System.)ollections; namespace DoFactory.GangOfFour.0uil"er.Structural { // MainApp test aplikaci a public class MainApp { public static !oi" Main#$ { // )reate "irector an" buil"ers Director "irector ' ne( Director#$; 0uil"er b& ' ne( )oncrete0uil"er&#$; 0uil"er b+ ' ne( )oncrete0uil"er+#$; // )onstruct t(o pro"ucts "irector.)onstruct#b&$; /ro"uct p& ' b&.Get*esult#$; p&.S4o(#$; "irector.)onstruct#b+$; /ro"uct p+ ' b+.Get*esult#$; p+.S4o(#$; // ,ait for user )onsole.*ea"#$; // .Director. class Director { // 0uil"er uses a comple; series of steps public !oi" )onstruct#0uil"er buil"er$ { buil"er.0uil"/artA#$;

buil"er.0uil"/art0#$; // .0uil"er. abstract { public public public class 0uil"er abstract !oi" 0uil"/artA#$; abstract !oi" 0uil"/art0#$; abstract /ro"uct Get*esult#$;

// .)oncrete0uil"er&. class )oncrete0uil"er& 1 0uil"er { pri!ate /ro"uct pro"uct ' ne( /ro"uct#$; public o!erri"e !oi" 0uil"/artA#$ { pro"uct.A""#./artA.$; public o!erri"e !oi" 0uil"/art0#$ { pro"uct.A""#./art0.$; public o!erri"e /ro"uct Get*esult#$ { return pro"uct; // .)oncrete0uil"er+. class )oncrete0uil"er+ 1 0uil"er { pri!ate /ro"uct pro"uct ' ne( /ro"uct#$; public o!erri"e !oi" 0uil"/artA#$ { pro"uct.A""#./art<.$; public o!erri"e !oi" 0uil"/art0#$ { pro"uct.A""#./art=.$; public o!erri"e /ro"uct Get*esult#$ { return pro"uct;

// ./ro"uct. class /ro"uct { Array3ist parts ' ne( Array3ist#$; public !oi" A""#string part$ { parts.A""#part$; public !oi" S4o(#$ { )onsole.,rite3ine#.>n/ro"uct /arts -------.$; foreac4 #string part in parts$ )onsole.,rite3ine#part$; -

8zlaz
/ro"uct /arts ------/artA /art0 /ro"uct /arts ------/art< /art=

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje sluaj sklapanja razliiti' vozila, i to deo po deo. +lasa 0'op koristi 3e'icle2uilders da bi kreirala razliite objekte klase 3e'icles. Ovi objekti se kreiraju nakon niza sekvencijalni' koraka.

// 0uil"er pattern -- /rimer i8 st!arnog s!eta using System; using System.)ollections; namespace DoFactory.GangOfFour.0uil"er.*eal,orl"

{ // MainApp test aplikaci a public class MainApp { public static !oi" Main#$ { // ?reiran e ob ekta s4op i ob ekata klase @e4icle0uil"er S4op s4op ' ne( S4op#$; @e4icle0uil"er b& ' ne( Scooter0uil"er#$; @e4icle0uil"er b+ ' ne( )ar0uil"er#$; @e4icle0uil"er bA ' ne( Motor)ycle0uil"er#$; // ?onstruisan e i prika8i!an e !o8ila s4op.)onstruct#b&$; b&.@e4icle.S4o(#$; s4op.)onstruct#b+$; b+.@e4icle.S4o(#$; s4op.)onstruct#bA$; bA.@e4icle.S4o(#$; // ,ait for user )onsole.*ea"#$; // .Director. class S4op { // Meto"a ko a "efiniBe sloCen ni8 koraka ko e De koristiti klasa 0uil"er public !oi" )onstruct#@e4icle0uil"er !e4icle0uil"er$ { !e4icle0uil"er.0uil"Frame#$; !e4icle0uil"er.0uil":ngine#$; !e4icle0uil"er.0uil",4eels#$; !e4icle0uil"er.0uil"Doors#$; // .0uil"er. abstract class @e4icle0uil"er { protecte" @e4icle !e4icle; public @e4icle @e4icle { get{ return !e4icle; public abstract !oi" 0uil"Frame#$;

public abstract !oi" 0uil":ngine#$; public abstract !oi" 0uil",4eels#$; public abstract !oi" 0uil"Doors#$; // .)oncrete0uil"er&. class Motor)ycle0uil"er 1 @e4icle0uil"er { public o!erri"e !oi" 0uil"Frame#$ { !e4icle ' ne( @e4icle#.Motor)ycle.$; !e4icleE.frame.F ' .Motor)ycle Frame.; public o!erri"e !oi" 0uil":ngine#$ { !e4icleE.engine.F ' .GHH cc.; public o!erri"e !oi" 0uil",4eels#$ { !e4icleE.(4eels.F ' .+.; public o!erri"e !oi" 0uil"Doors#$ { !e4icleE."oors.F ' .H.; // .)oncrete0uil"er+. class )ar0uil"er 1 @e4icle0uil"er { public o!erri"e !oi" 0uil"Frame#$ { !e4icle ' ne( @e4icle#.)ar.$; !e4icleE.frame.F ' .)ar Frame.; public o!erri"e !oi" 0uil":ngine#$ { !e4icleE.engine.F ' .+GHH cc.; public o!erri"e !oi" 0uil",4eels#$ { !e4icleE.(4eels.F ' .I.; public o!erri"e !oi" 0uil"Doors#$ { !e4icleE."oors.F ' .I.;

// .)oncrete0uil"erA. class Scooter0uil"er 1 @e4icle0uil"er { public o!erri"e !oi" 0uil"Frame#$ { !e4icle ' ne( @e4icle#.Scooter.$; !e4icleE.frame.F ' .Scooter Frame.; public o!erri"e !oi" 0uil":ngine#$ { !e4icleE.engine.F ' .GH cc.; public o!erri"e !oi" 0uil",4eels#$ { !e4icleE.(4eels.F ' .+.; public o!erri"e !oi" 0uil"Doors#$ { !e4icleE."oors.F ' .H.; // ./ro"uct. class @e4icle { pri!ate string type; pri!ate 9as4table parts ' ne( 9as4table#$; // )onstructor public @e4icle#string type$ { t4is.type ' type; // 2n"ekser ko i nam omoguDa!a pristup Jlano!ima ni8a na osno!u n i4o!og imena public ob ect t4isEstring keyF { get{ return partsEkeyF; set{ partsEkeyF ' !alue; public !oi" S4o(#$ { )onsole.,rite3ine#.>n---------------------------.$; )onsole.,rite3ine#.@e4icle 5ype1 {H-.K type$;

)onsole.,rite3ine#. )onsole.,rite3ine#. )onsole.,rite3ine#. )onsole.,rite3ine#. -

Frame 1 {H-.K partsE.frame.F$; :ngine 1 {H-.K partsE.engine.F$; %,4eels1 {H-.K partsE.(4eels.F$; %Doors 1 {H-.K partsE."oors.F$;

8zlaz
--------------------------@e4icle 5ype1 Scooter Frame 1 Scooter Frame :ngine 1 none %,4eels1 + %Doors 1 H --------------------------@e4icle 5ype1 )ar Frame 1 )ar Frame :ngine 1 +GHH cc %,4eels1 I %Doors 1 I --------------------------@e4icle 5ype1 Motor)ycle Frame 1 Motor)ycle Frame :ngine 1 GHH cc %,4eels1 + %Doors 1 H

Fabriki

etod (Factory !ethod)

Definicija
&efinie interfejs za kreiranje objekata, ali dozvoljava da izvedena klasa odlui koju e klasu da instancira. Ovaj obrazac omoguuje da se jasno razlui instancijacija objekata izvedeni' klasa.

U ! Dijagra# klasa

$le#enti
+lase i6ili objekti koje uestvuju u ovom obrascu su% Pro"uct (Page) o definie interfejs za objekat koji e biti kreiran

ConcretePro"uct (SkillsPage' $"ucationPage' $0periencePage) o implementira interfejs klase Product

Creator (Docu#ent) o deklarie #actor7-et'od koji treba da vrati objekat tipa Product. +lasa (reator moe, takoe, da definie osnovnu implementaciju ovog metoda koji e vratiti najjednostavniji !onaj koji se kreira default konstruktorom$ objekat klase (oncreteProduct. o moe da definie poziv za kreiranje objekata klase Product.

ConcreteCreator (1eport' 1esu#e) o predefinie #actor7-et'od kako bi vraao instancu klase (oncreteProduct.

Pri#er ko"a u je+iku C,Ovaj strukturni kod prikazuje svu fleksibilnost koju obrazac #actor7-et'od nudi prilikom kreiranja razliiti' objekata. *pstraktna klasa Product moe da obezbedi default objekat, ali svaka izvedena klasa moe instancirati proirenu verziju osnovnog objekta.

// Factory Met4o" pattern -- Strukturni primer using System; using System.)ollections; namespace DoFactory.GangOfFour.Factory.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // 6i8 kreatorski4 ob ekata )reatorEF creators ' ne( )reatorE+F; creatorsEHF ' ne( )oncrete)reatorA#$; creatorsE&F ' ne( )oncrete)reator0#$; // ?reDe se o" kreatora "o kreatora i kreira ob ekte foreac4#)reator creator in creators$ { /ro"uct pro"uct ' creator.FactoryMet4o"#$; )onsole.,rite3ine#.)reate" {H-.K pro"uct.Get5ype#$.6ame$; // ,ait for user )onsole.*ea"#$; // ./ro"uct. abstract class /ro"uct { // .)oncrete/ro"uctA. class )oncrete/ro"uctA 1 /ro"uct { -

// .)oncrete/ro"uct0. class )oncrete/ro"uct0 1 /ro"uct { // .)reator. abstract class )reator { public abstract /ro"uct FactoryMet4o"#$; // .)oncrete)reator. class )oncrete)reatorA 1 )reator { public o!erri"e /ro"uct FactoryMet4o"#$ { return ne( )oncrete/ro"uctA#$; // .)oncrete)reator. class )oncrete)reator0 1 )reator { public o!erri"e /ro"uct FactoryMet4o"#$ { return ne( )oncrete/ro"uct0#$; -

8zlaz
)reate" )oncrete/ro"uctA )reate" )oncrete/ro"uct0

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje fleksibilnost koju #actor7-et'od nudi pri kreiranju razliiti' dokumenata. +lase .eport i .esume su izvedene iz klase &ocument i zapravo instanciraju proirene verzije objekata klase &ocument. , metodi #actor7-et'od se zapravo poziva konstruktor osnovne klase : klase &ocument.

// Factory Met4o" -- /rimer i8 st!arnog s!eta using System; using System.)ollections; namespace DoFactory.GangOfFour.Factory.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // ?onstruktori treba "a po8i!a u FactoryMet4o" DocumentEF "ocuments ' ne( DocumentE+F; "ocumentsEHF ' ne( *esume#$; "ocumentsE&F ' ne( *eport#$; // /rika8u e "okumente foreac4 #Document "ocument in "ocuments$ { )onsole.,rite3ine#.>n. 7 "ocument.Get5ype#$.6ame7 .--.$; foreac4 #/age page in "ocument./ages$ { )onsole.,rite3ine#. . 7 page.Get5ype#$.6ame$; // Leka korisnika )onsole.*ea"#$; // ./ro"uct. abstract class /age { // .)oncrete/ro"uct. class Skills/age 1 /age { // .)oncrete/ro"uct. class :"ucation/age 1 /age { // .)oncrete/ro"uct.

class :;perience/age 1 /age { // .)oncrete/ro"uct. class 2ntro"uction/age 1 /age { // .)oncrete/ro"uct. class *esults/age 1 /age { // .)oncrete/ro"uct. class )onclusion/age 1 /age { // .)oncrete/ro"uct. class Summary/age 1 /age { // .)oncrete/ro"uct. class 0ibliograp4y/age 1 /age { // .)reator. abstract class Document { pri!ate Array3ist pages ' ne( Array3ist#$; // ?onstruktor 8o!e FactoryMet4o" public Document#$ { t4is.)reate/ages#$; public Array3ist /ages { get{ return pages; // FactoryMet4o" public abstract !oi" )reate/ages#$;

// .)oncrete)reator. class *esume 1 Document { // implementaci a FactoryMet4o"-a public o!erri"e !oi" )reate/ages#$ { /ages.A""#ne( Skills/age#$$; /ages.A""#ne( :"ucation/age#$$; /ages.A""#ne( :;perience/age#$$; // .)oncrete)reator. class *eport 1 Document { // implementaci a FactoryMet4o"-a public o!erri"e !oi" )reate/ages#$ { /ages.A""#ne( 2ntro"uction/age#$$; /ages.A""#ne( *esults/age#$$; /ages.A""#ne( )onclusion/age#$$; /ages.A""#ne( Summary/age#$$; /ages.A""#ne( 0ibliograp4y/age#$$; -

8zlaz
*esume ------Skills/age :"ucation/age :;perience/age *eport ------2ntro"uction/age *esults/age )onclusion/age Summary/age 0ibliograp4y/age

Prototip (Prototype)

Definicija
Ovaj obrazac slui za specificiranje vrste objekata koji e biti kreirani pomou tzv. prototipne instance, kao i za kreiranje novi' objekata kopiranjem prototipa.

U ! Dijagra# klasa

$le#enti
+lase i6ili objekti koje uestvuju u ovom obrascu su% Protot&pe (ColorProtot&pe) o deklarie interfejs pomou koga objekat moe da klonira sebe samog

ConcreteProtot&pe (Color) o implementira operaciju kloniranja sebe samog

Client (Color anager) o kreira novi objekat tako to od prototipa za'teva da se iskopira

Pri#er ko"a u je+iku C,Ovaj strukturni kod predstavlja obrazac Protot7pe u kome se novi objekti kreiraju kopiranjem ve postojei' objekata !prototipova$ iste klase.

// /rototype -- Strukturni primer using System; namespace DoFactory.GangOfFour./rototype.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // ?reiran e "!e instance i n i4o!o kloniran e )oncrete/rototype& p& ' ne( )oncrete/rototype&#.2.$; )oncrete/rototype& c& ' #)oncrete/rototype&$p&.)lone#$; )onsole.,rite3ine #.)lone"1 {H-.K c&.2"$; )oncrete/rototype+ p+ ' ne( )oncrete/rototype+#.22.$; )oncrete/rototype+ c+ ' #)oncrete/rototype+$p+.)lone#$; )onsole.,rite3ine #.)lone"1 {H-.K c+.2"$; // ,ait for user )onsole.*ea"#$; // ./rototype. abstract class /rototype { pri!ate string i"; // ?onstruktor public /rototype#string i"$ { t4is.i" ' i"; public string 2" { get{ return i"; -

public abstract /rototype )lone#$; // .)oncrete/rototype&. class )oncrete/rototype& 1 /rototype { // ?onstruktor public )oncrete/rototype&#string i"$ 1 base#i"$ { public o!erri"e /rototype )lone#$ { // :g8aktna kopi a return #/rototype$t4is.Member(ise)lone#$; // .)oncrete/rototype+. class )oncrete/rototype+ 1 /rototype { // ?onstruktor public )oncrete/rototype+#string i"$ 1 base#i"$ { public o!erri"e /rototype )lone#$ { // :g8aktna kopi a return #/rototype$t4is.Member(ise)lone#$; -

8zlaz
)lone"1 2 )lone"1 22

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje obrazac Protot7pe pomou koga se kreiraju nove instance klase (olor kopiranjem pret'odno postojei' objekata istog tipa koje je korisnik ve definisao.

// /rototype -- /rimer i8 st!arnog s!eta using System; using System.)ollections; namespace DoFactory.GangOfFour./rototype.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { )olorManager colormanager ' ne( )olorManager#$; // 2nici ali8aci a stan"ar"ni4 bo a colormanagerE.re". F ' ne( )olor#+GGK HK H$; colormanagerE.green.F ' ne( )olor# HK +GGK H$; colormanagerE.blue. F ' ne( )olor# HK HK +GG$; // 0o e ko e e "efinisao korisnik colormanagerE.angry.F ' ne( )olor#+GGK GIK H$; colormanagerE.peace.F ' ne( )olor#&+MK +&&K &+M$; colormanagerE.flame.F ' ne( )olor#+&&K AIK +H$; )olor color; // Npotreba o"abrani4 bo a string name ' .re".; color ' colormanagerEnameF.)lone#$ as )olor; name ' .peace.; color ' colormanagerEnameF.)lone#$ as )olor; name ' .flame.; color ' colormanagerEnameF.)lone#$ as )olor; // Lekan e na korisniJki unos )onsole.*ea"#$; // ./rototype. abstract class )olor/rototype { public abstract )olor/rototype )lone#$; -

// .)oncrete/rototype. class )olor 1 { pri!ate int pri!ate int pri!ate int )olor/rototype re"; green; blue;

// ?onstruktor public )olor#int re"K int greenK int blue$ { t4is.re" ' re"; t4is.green ' green; t4is.blue ' blue; // ?reiran e eg8aktne kopi e public o!erri"e )olor/rototype )lone#$ { )onsole.,rite3ine# .)loning color *G01 {HKA-K{&KA-K{+KA-.K re"K greenK blue$; return t4is.Member(ise)lone#$ as )olor/rototype; // ?lasa ko a !o"i raJuna o bo ama class )olorManager { 9as4table colors ' ne( 9as4table#$; // 2n"ekser po imenu public )olor/rototype t4isEstring nameF { get { return colorsEnameF as )olor/rototype; set { colors.A""#nameK !alue$; -

8zlaz
)loning color *G01 +GGK HK H )loning color *G01 &+MK+&&K&+M )loning color *G01 +&&K AIK +H

"sa ljenik (Sin#leton)

Definicija
Obezbeuje da odreena klasa ima maksimalno jedan aktivni objekat, i obezbeuje nain za pristup njemu.

U ! Dijagra# klasa

$le#enti
+lase i6ili objekti koje uestvuju u ovom obrascu su% Singleton (!oa"Balancer) o definie operaciju 8nstance koja obezbeuje korisniku pristup jedinom kreiranom objektu o definie konstruktor koji je odgovoran za kreiranje i odravanje svog jedinog objekta

Pri#er ko"a u je+iku C,Ovaj strukturni kod demonstrira upotrebu klase koja je napravljena po obrascu 0ingleton.
// Singleton O Strukturni primer using System; namespace DoFactory.GangOfFour.Singleton.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$

{ // ?onstruktor e Pprotecte"Q O ne moCe se instancirati sa Pne(Q Singleton s& ' Singleton.2nstance#$; Singleton s+ ' Singleton.2nstance#$; if #s& '' s+$ { )onsole.,rite3ine#.Ob ects are t4e same instance.$; // Lekan e na korisniJki unos )onsole.*ea"#$; // .Singleton. class Singleton { pri!ate static Singleton instance; // Pprotecte"Q konstruktor protecte" Singleton#$ { public static Singleton 2nstance#$ { // O!o se 8o!e Plen aQ inici ali8aci a if #instance '' null$ { instance ' ne( Singleton#$; return instance; -

Ob ects are t4e same instance

Pri#er i+ st)arnog s)eta


Ovaj primer prikazuje primenu obrasca 0ingleton na objekat klase ;oad2alancing. +reirae se samo jedna instanca klase zato to server moe dinamiki da menja stanje iz on9line u off9line. <bog toga e se za'tev prosleivati kroz jedan objekat koji e voditi rauna o stanju cele =eb farme.
// Singleton pattern -- /rimer i8 st!arnog s!eta using System; using System.)ollections; using System.54rea"ing;

namespace DoFactory.GangOfFour.Singleton.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { 3oa"0alancer b& ' 3oa"0alancer b+ ' 3oa"0alancer bA ' 3oa"0alancer bI '

3oa"0alancer.Get3oa"0alancer#$; 3oa"0alancer.Get3oa"0alancer#$; 3oa"0alancer.Get3oa"0alancer#$; 3oa"0alancer.Get3oa"0alancer#$;

// 2ste instanceR if #b& '' b+ SS b+ '' bA SS bA '' bI$ { )onsole.,rite3ine#.Same instance>n.$; // /oBto su s!i 8apra!o ista instanca b& De se koristiti arbitrarno // NJita!an e &G 8a4te!a ser!eru for #int i ' H; i T &G; i77$ { )onsole.,rite3ine#b&.Ser!er$; // Lekan e na korisniJki unos )onsole.*ea"#$; // .Singleton. class 3oa"0alancer { pri!ate static 3oa"0alancer instance; pri!ate Array3ist ser!ers ' ne( Array3ist#$; pri!ate *an"om ran"om ' ne( *an"om#$; // Sin4roni8acioni ob ekat pri!ate static ob ect sync3ock ' ne( ob ect#$; // ?onstruktor #protecte"$ protecte" 3oa"0alancer#$ { // 3ista raspoloCi!i4 ser!era ser!ers.A""#.Ser!er2.$; ser!ers.A""#.Ser!er22.$; ser!ers.A""#.Ser!er222.$; ser!ers.A""#.Ser!er2@.$; ser!ers.A""#.Ser!er@.$; -

public static 3oa"0alancer Get3oa"0alancer#$ { // /o"rBka 8a aplikaci u sa !iBe niti kro8 t8!. // UDouble c4ecke" lockingU meto"u sin4roni8aci e. // O!o De omoguDiti "a ka"a se e"nom kreira instancaK 8akl uJa!an e // se neDe !rBiti pri s!akom 8a4te!u if #instance '' null$ { lock #sync3ock$ { if #instance '' null$ { instance ' ne( 3oa"0alancer#$; return instance; // Ve"nosta!no kreriran e ser!era public string Ser!er { get { int r ' ran"om.6e;t#ser!ers.)ount$; return ser!ersErF.5oString#$; -

8zlaz
Same instance Ser!er222 Ser!er22 Ser!er2 Ser!er22 Ser!er2 Ser!er222 Ser!er2 Ser!er222 Ser!er2@ Ser!er22 Ser!er22 Ser!er222 Ser!er2@ Ser!er22 Ser!er2@

Strukturni obrasci (Structural Patterns)

Pre#ovara (Adapter)
Definicija
+onvertuje interfejs jedne klase u interfejs kakav oekuje druga klasa. Obrazac *dapter omoguava da klasa, koje inae ne bi mogle zbog razliiti' interfejsa, funkcioniu zajedno.

U ! Dijagra# klasa

$le#enti
+lase i6ili objekti koje uestvuju u ovom obrascu su% 2arget (C/e#icalCo#poun") o definie specifini interfejs koji koristi klasa (lient.

%"apter (Co#poun") o adaptira interfejs klase *daptee prema interfejsu klase.

%"aptee (C/e#icalDatabank) o definie postojei interfejs koji treba adaptirati.

Client (%"apter%pp) o vodi rauna o objektima koji za'tevaju interfejs klase arget

Pri#er ko"a u je+iku C,


Ovaj strukturni primer pokazuje upotrebu obrasca *dapter koji definie preslikavanje interfejsa jedne klase u drugu. Ovakve nekompatibilne klase mogu da potiu kako iz razliiti' tako i iz istog prostora imena !namespace$.
// A"apter -- Strukturni primer using System; namespace DoFactory.GangOfFour.A"apter.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // )reate a"apter an" place a reWuest 5arget target ' ne( A"apter#$; target.*eWuest#$; // ,ait for user )onsole.*ea"#$; // .5arget. class 5arget { public !irtual !oi" *eWuest#$ { )onsole.,rite3ine#.)alle" 5arget *eWuest#$.$; // .A"apter. class A"apter 1 5arget { pri!ate A"aptee a"aptee ' ne( A"aptee#$; public o!erri"e !oi" *eWuest#$ { // O!"e e moguDe ura"iti na pre i neki "rugi posao // pa tek on"a po8!ati Specific*eWuest a"aptee.Specific*eWuest#$; -

// .A"aptee. class A"aptee { public !oi" Specific*eWuest#$ { )onsole.,rite3ine#.)alle" Specific*eWuest#$.$; -

8zlaz
)alle" Specific*eWuest#$

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje upotrebu banke podataka 'emijski' jedinjenja. 0loena 'emijska jedinjenja pristupaju banci podataka na osnovu interfejsa koji im je omoguio interfejs klase *dapter.
// A"apter -- /rimer i8 st!arnog s!eta using System; namespace DoFactory.GangOfFour.A"apter.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // 6ea"aptirano 4emi sko e"in en e )ompoun" stuff ' ne( )ompoun"#.Nnkno(n.$; stuff.Display#$; // A"aptirano 4emi sko e"in en e )ompoun" (ater ' ne( *ic4)ompoun"#.,ater.$; (ater.Display#$; )ompoun" ben8ene ' ne( *ic4)ompoun"#.0en8ene.$; ben8ene.Display#$; )ompoun" alco4ol ' ne( *ic4)ompoun"#.Alco4ol.$; alco4ol.Display#$; // Lekan e na korisniko! unos

)onsole.*ea"#$; // .5arget. class )ompoun" { protecte" string name; protecte" float boiling/oint; protecte" float melting/oint; protecte" "ouble molecular,eig4t; protecte" string molecularFormula; // ?onstruktor public )ompoun"#string name$ { t4is.name ' name; public !irtual !oi" Display#$ { )onsole.,rite3ine#.>n)ompoun"1 {H- ------ .K name$; // .A"apter. class *ic4)ompoun" 1 )ompoun" { pri!ate )4emicalDatabank bank; // ?onstruktor public *ic4)ompoun"#string name$ 1 base#name$ { public o!erri"e !oi" Display#$ { bank ' ne( )4emicalDatabank#$; boiling/oint ' bank.Get)ritical/oint#nameK .0.$; melting/oint ' bank.Get)ritical/oint#nameK .M.$; molecular,eig4t ' bank.GetMolecular,eig4t#name$; molecularFormula ' bank.GetMolecularStructure#name$; base.Display#$; )onsole.,rite3ine#. )onsole.,rite3ine#. )onsole.,rite3ine#. )onsole.,rite3ine#. // .A"aptee.

Formula1 {H-.K molecularFormula$; ,eig4t 1 {H-.K molecular,eig4t$; Melting /t1 {H-.K melting/oint$; 0oiling /t1 {H-.K boiling/oint$;

class )4emicalDatabank { // banka po"ataka preu8eto sa Ulegacy A/2U public float Get)ritical/oint#string compoun"K string point$ { float temperature ' H.HF; // 5aJka mrCn en a if #point '' .M.$ { s(itc4 #compoun".5o3o(er#$$ { case .(ater. 1 temperature ' case .ben8ene. 1 temperature case .alco4ol. 1 temperature // 5aJka kl uJan a else { s(itc4 #compoun".5o3o(er#$$ { case .(ater. 1 temperature ' case .ben8ene. 1 temperature case .alco4ol. 1 temperature return temperature; public string GetMolecularStructure#string compoun"$ { string structure ' ..; s(itc4 { case case case return public "ouble GetMolecular,eig4t#string compoun"$ { "ouble (eig4t ' H.H; s(itc4 #compoun".5o3o(er#$$ { case .(ater. 1 (eig4t ' &M.H&G; break; case .ben8ene. 1 (eig4t ' XM.&&AI; break; case .alco4ol. 1 (eig4t ' IY.HYMM; break; return (eig4t; #compoun".5o3o(er#$$ .(ater. 1 structure ' .9+H.; break; .ben8ene. 1 structure ' .)Y9Y.; break; .alco4ol. 1 structure ' .)+9YO+.; break; structure;

H.HF; break; ' G.GF; break; ' -&&I.&F; break;

&HH.HF; break; ' MH.&F; break; ' XM.AF; break;

8zlaz
)ompoun"1 Nnkno(n -----)ompoun"1 ,ater -----Formula1 9+H ,eig4t 1 &M.H&G Melting /t1 H 0oiling /t1 &HH )ompoun"1 0en8ene -----Formula1 )Y9Y ,eig4t 1 XM.&&AI Melting /t1 G.G 0oiling /t1 MH.& )ompoun"1 Alco4ol -----Formula1 )+9YO+ ,eig4t 1 IY.HYMM Melting /t1 -&&I.& 0oiling /t1 XM.A

!ost (Brid#e)

Definicija
.azdvaja apstrakciju od njene implementacije tako da se ove dve stvari kasnije mogu menjati nezavisno.

U ! Dijagra# klasa

$le#enti
+lase i6ili objekti koje uestvuju u ovom obrascu su% %bstraction (BusinessObject) o o definie interfejs apstrakcije. uva referencu na objekat klase koja implementira apstrakciju.

1efine"%bstraction (Custo#ersBusinessObject) o proiruje interfejs koji definie klasa *bstraction.

3#ple#entor (DataObject) o definie interfejs za implementacione klase. Ovaj interfejs ne mora da apsolutno odgovara interfejsu definisanom u klasi *bstraction> zapravo, ova dva interfejsa mogu biti prilino razliita. 4ajee interfejs klase 8mplementor sadri samo

primitivne operacije dok klasa *bstraction definie defines operacije vieg nivoa bazirane na tim primitivama. Concrete3#ple#entor (Custo#ersDataObject) o 8mplementira interfejs iz klase 8mplementor za konkretni sluaj.

Pri#er ko"a u je+iku C,


Ovaj strukturni kod predstavlja implementaciju obrasca 2ridge. Obrazac 2ridge razdvaja interfejs od implementacije. 8mplementacija se sada moe raditi bez uticaja na klijentske klase koje koriste apstrakciju implementirani' objekata.
// 0ri"ge pattern -- Strukturni primer using System; namespace DoFactory.GangOfFour.0ri"ge.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { Abstraction ab ' ne( *efine"Abstraction#$; // /osta!i implementaci u i po8o!i operaci u ab.2mplementor ' ne( )oncrete2mplementorA#$; ab.Operation#$; // /romeni implementaci u i po8o!i operaci u ab.2mplementor ' ne( )oncrete2mplementor0#$; ab.Operation#$; // Lekan e na korisniJki ula8 )onsole.*ea"#$; // .Abstraction. class Abstraction { protecte" 2mplementor implementor; public 2mplementor 2mplementor { set{ implementor ' !alue; -

public !irtual !oi" Operation#$ { implementor.Operation#$; // .2mplementor. abstract class 2mplementor { public abstract !oi" Operation#$; // .*efine"Abstraction. class *efine"Abstraction 1 Abstraction { public o!erri"e !oi" Operation#$ { implementor.Operation#$; // .)oncrete2mplementorA. class )oncrete2mplementorA 1 2mplementor { public o!erri"e !oi" Operation#$ { )onsole.,rite3ine#.)oncrete2mplementorA Operation.$; // .)oncrete2mplementor0. class )oncrete2mplementor0 1 2mplementor { public o!erri"e !oi" Operation#$ { )onsole.,rite3ine#.)oncrete2mplementor0 Operation.$; -

8zlaz
)oncrete2mplementorA Operation )oncrete2mplementor0 Operation

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta pokazuje upotrebu obrasca 2ridge pomou koga je apstrakcija podataka !interfejs$ u klasi 2usinessObject razdvojena od implementacije u klasi &ataObject. 8mplementacije instanci klase &ataObject mogu se dinamiki menjati bez ikakvi' uticaja na klase koje i' koriste !klijente$.
// 0ri"ge -- /rimer i8 st!arnog s!eta using System; using System.)ollections; namespace DoFactory.GangOfFour.0ri"ge.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // ?reira *efine"Abstraction ob ekat )ustomers customers ' ne( )ustomers#.)4icago.$; // /osta!i )oncrete2mplementor customers.Data ' ne( )ustomersData#$; // :;ercise t4e bri"ge customers.S4o(#$; customers.6e;t#$; customers.S4o(#$; customers.6e;t#$; customers.S4o(#$; customers.6e(#.9enry @elasWue8.$; customers.S4o(All#$; // ,ait for user )onsole.*ea"#$; // .Abstraction. class )ustomers0ase

{ pri!ate DataOb ect "ataOb ect; protecte" string group; public )ustomers0ase#string group$ { t4is.group ' group; public DataOb ect Data { set{ "ataOb ect ' !alue; get{ return "ataOb ect; public !irtual !oi" 6e;t#$ { "ataOb ect.6e;t*ecor"#$; public !irtual !oi" /rior#$ { "ataOb ect./rior*ecor"#$; public !irtual !oi" 6e(#string name$ { "ataOb ect.6e(*ecor"#name$; public !irtual !oi" Delete#string name$ { "ataOb ect.Delete*ecor"#name$; public !irtual !oi" S4o(#$ { "ataOb ect.S4o(*ecor"#$; public !irtual !oi" S4o(All#$ { )onsole.,rite3ine#.)ustomer Group1 . 7 group$; "ataOb ect.S4o(All*ecor"s#$; // .*efine"Abstraction. class )ustomers 1 )ustomers0ase { // ?onstruktor public )ustomers#string group$ 1 base#group$ {

public o!erri"e !oi" S4o(All#$ { )onsole.,rite3ine#$; )onsole.,rite3ine #.------------------------.$; base.S4o(All#$; )onsole.,rite3ine #.------------------------.$; // .2mplementor. abstract { public public public public public public class DataOb ect abstract abstract abstract abstract abstract abstract !oi" !oi" !oi" !oi" !oi" !oi" 6e;t*ecor"#$; /rior*ecor"#$; 6e(*ecor"#string name$; Delete*ecor"#string name$; S4o(*ecor"#$; S4o(All*ecor"s#$;

// .)oncrete2mplementor. class )ustomersData 1 DataOb ect { pri!ate Array3ist customers ' ne( Array3ist#$; pri!ate int current ' H; public )ustomersData#$ { customers.A""#.Vim Vones.$; customers.A""#.Samual Vackson.$; customers.A""#.Allen Goo".$; customers.A""#.Ann Stills.$; customers.A""#.3isa Giolani.$; public o!erri"e !oi" 6e;t*ecor"#$ { if #current T' customers.)ount - &$ { current77; public o!erri"e !oi" /rior*ecor"#$ { if #current Z H$ { current--; -

public o!erri"e !oi" 6e(*ecor"#string name$ { customers.A""#name$; public o!erri"e !oi" Delete*ecor"#string name$ { customers.*emo!e#name$; public o!erri"e !oi" S4o(*ecor"#$ { )onsole.,rite3ine#customersEcurrentF$; public o!erri"e !oi" S4o(All*ecor"s#$ { foreac4 #string name in customers$ { )onsole.,rite3ine#. . 7 name$; -

8zlaz
Vim Vones Samual Vackson Allen Goo" -----------------------)ustomer Group1 )4icago Vim Vones Samual Vackson Allen Goo" Ann Stills 3isa Giolani 9enry @elasWue8 ------------------------

$o po%icija (Co posite)


Definicija
,reuje objekte u 'ijerar'ijsku strukturu stabla. Obrazac (omposite dozvoljava klijentu da i posebne objekte i kompozicije tretira na isti nain.

U ! Dijagra# klasa

$le#enti
+lase i6ili objekti koje uestvuju u ovom obrascu su% Co#ponent (Dra4ing$le#ent) o o o deklarie interfejs za objekte koji mogu da ine kompoziciju implementira osnovno ponaanje za interfejs zajedniki svim klasama deklarie interfejs za pristup i manipulaciju njegovim podelementima !c'ild components$ o !opciono$ definie i implementira interfejs za pristup roditeljskom elementu u rekurzivnim strukturama !eaf (Pri#iti)e$le#ent)

predstavlja objekat koji uestvuje u kompoziciji. Ovako se predstavljaju tzv. listovi !elementi koji nemaju podelemente$

definie ponaanje za primitivne objekte u kompoziciji

Co#posite (Co#posite$le#ent) o o o definie ponaanje elemenata koji mogu da imaju podelemente uva podelemente implementira operacije koje se odnose na podelemente u interfejsu klase (omponent

Client (Co#posite%pp) o manipulie objektima kompozicije kroz interfejs koji obezbeuje klasa (omponent

Pri#er ko"a u je+iku C,Ovaj strukturni kod prikazuje obrazac (omposite koji omoguava kreiranje strukture stabla gde se svakom voru pristupa na potpuno isti nain bez obzira da li je on list ili grana.
// )omposite -- Strukturni primer using System; using System.)ollections; namespace DoFactory.GangOfFour.)omposite.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // ?reiran e strukture stabla )omposite root ' ne( )omposite#.root.$; root.A""#ne( 3eaf#.3eaf A.$$; root.A""#ne( 3eaf#.3eaf 0.$$; )omposite comp ' ne( )omposite#.)omposite <.$; comp.A""#ne( 3eaf#.3eaf <A.$$; comp.A""#ne( 3eaf#.3eaf <0.$$; root.A""#comp$; root.A""#ne( 3eaf#.3eaf ).$$; // Do"a!an e i i8baci!an e listo!a

3eaf leaf ' ne( 3eaf#.3eaf D.$; root.A""#leaf$; root.*emo!e#leaf$; // *ekur8i!ni prika8 stabla root.Display#&$; // Lekan e na korisniko! unos )onsole.*ea"#$; // .)omponent. abstract class )omponent { protecte" string name; // ?onstruktor public )omponent#string name$ { t4is.name ' name; public abstract !oi" A""#)omponent c$; public abstract !oi" *emo!e#)omponent c$; public abstract !oi" Display#int "ept4$; // .)omposite. class )omposite 1 )omponent { pri!ate Array3ist c4il"ren ' ne( Array3ist#$; // ?onstruktor public )omposite#string name$ 1 base#name$ { public o!erri"e !oi" A""#)omponent component$ { c4il"ren.A""#component$; public o!erri"e !oi" *emo!e#)omponent component$ { c4il"ren.*emo!e#component$; public o!erri"e !oi" Display#int "ept4$ { )onsole.,rite3ine#ne( String#U-UK "ept4$ 7 name$;

// *ekur8i!ni prika8 po"elemenata foreac4 #)omponent component in c4il"ren$ { component.Display#"ept4 7 +$; // .3eaf. class 3eaf 1 )omponent { // ?onstruktor public 3eaf#string name$ 1 base#name$ { public o!erri"e !oi" A""#)omponent c$ { )onsole.,rite3ine#.)annot a"" to a leaf.$; public o!erri"e !oi" *emo!e#)omponent c$ { )onsole.,rite3ine#.)annot remo!e from a leaf.$; public o!erri"e !oi" Display#int "ept4$ { )onsole.,rite3ine#ne( String#U-UK "ept4$ 7 name$; -

8zlaz
-root ---3eaf A ---3eaf 0 ---)omposite < -----3eaf <A -----3eaf <0 ---3eaf )

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje ulogu obrasca (omposite u kreiranju grafike strukture stabla koja je sainjena od primitivni' elemenata !linija, krugova$ i sloeni' vorova !grupe elemenata za crtanje od koji' se prave sloeniji elementi$

// )omposite -- /rimer i8 st!arnog s!eta using System; using System.)ollections; namespace DoFactory.GangOfFour.)omposite.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // ?reiran e strukture stabla )omposite:lement root ' ne( )omposite:lement#./icture.$; root.A""#ne( /rimiti!e:lement#.*e" 3ine.$$; root.A""#ne( /rimiti!e:lement#.0lue )ircle.$$; root.A""#ne( /rimiti!e:lement#.Green 0o;.$$; )omposite:lement comp ' ne( )omposite:lement#.5(o )ircles.$; comp.A""#ne( /rimiti!e:lement#.0lack )ircle.$$; comp.A""#ne( /rimiti!e:lement#.,4ite )ircle.$$; root.A""#comp$; // Do"a!an e i brisan e primiti!ni4 elemenata /rimiti!e:lement pe ' ne( /rimiti!e:lement#.=ello( 3ine.$; root.A""#pe$; root.*emo!e#pe$; // *ekur8i!ni prika8 stabla root.Display#&$; // Lekan e na korisniko! unos )onsole.*ea"#$; // .)omponent. O J!or u stablu

abstract class Dra(ing:lement { protecte" string name; // ?onstruktor public Dra(ing:lement#string name$ { t4is.name ' name; public abstract !oi" A""#Dra(ing:lement "$; public abstract !oi" *emo!e#Dra(ing:lement "$; public abstract !oi" Display#int in"ent$; // .3eaf. class /rimiti!e:lement 1 Dra(ing:lement { // ?onstruktor public /rimiti!e:lement#string name$ 1 base#name$ { public o!erri"e !oi" A""#Dra(ing:lement c$ { )onsole.,rite3ine# .)annot a"" to a /rimiti!e:lement.$; public o!erri"e !oi" *emo!e#Dra(ing:lement c$ { )onsole.,rite3ine# .)annot remo!e from a /rimiti!e:lement.$; public o!erri"e !oi" Display#int in"ent$ { )onsole.,rite3ine# ne( String#U-UK in"ent$ 7 . . 7 name$; // .)omposite. class )omposite:lement 1 Dra(ing:lement { pri!ate Array3ist elements ' ne( Array3ist#$; // ?onstruktor public )omposite:lement#string name$ 1 base#name$ { -

public o!erri"e !oi" A""#Dra(ing:lement "$ { elements.A""#"$; public o!erri"e !oi" *emo!e#Dra(ing:lement "$ { elements.*emo!e#"$; public o!erri"e !oi" Display#int in"ent$ { )onsole.,rite3ine#ne( String#U-UK in"ent$ 7 .7 . 7 name$; // Display eac4 c4il" element on t4is no"e foreac4 #Dra(ing:lement c in elements$ { c.Display#in"ent 7 +$; -

8zlaz
-7 /icture --- *e" 3ine --- 0lue )ircle --- Green 0o; ---7 5(o )ircles ----- 0lack )ircle ----- ,4ite )ircle

&ekorater (&ecorator)

Definicija
0lui za dinamiko dodavanje novi' funkcija nekom objektu. Obrazac &ecorator takoe omoguava fleksibilan nain za unapreenje funkcionalnosti ve dodati' potklasa.

U ! Dijagra# klasa

$le#enti
+lase i6ili objekti koje uestvuju u ovom obrascu su% Co#ponent (!ibrar&3te#) o definie interfejs za objekte kojima se dinamiki mogu dodavati nove funkcije

ConcreteCo#ponent (Book' .i"eo) o predstavlja klasu ijim se objektima mogu dinamiki dodavati funkcije

Decorator (Decorator)

uva referencu na objekat klase (omponent i definie interfejs koji se slae sa interfejsom klase (omponent

ConcreteDecorator (Borro4able) o dodaje nove funkcije komponenti

Pri#er ko"a u je+iku C,


Ovaj strukturni kod demonstrira upotrebu obrasca &ecorator koji dinami>ki dodaje funkcionalnosti postojeem objektu.
// Decorator -- Strukturni primer using System; namespace DoFactory.GangOfFour.Decorator.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // ?reira e"an ob ekat )oncrete)omponent i "!a ob ekta klase Decorator )oncrete)omponent c ' ne( )oncrete)omponent#$; )oncreteDecoratorA "& ' ne( )oncreteDecoratorA#$; )oncreteDecorator0 "+ ' ne( )oncreteDecorator0#$; // /o!e8i!an e "ekoratora "&.Set)omponent#c$; "+.Set)omponent#"&$; "+.Operation#$; // Lekan e na korisniJki unos )onsole.*ea"#$; // .)omponent. abstract class )omponent { public abstract !oi" Operation#$; -

// .)oncrete)omponent. class )oncrete)omponent 1 )omponent { public o!erri"e !oi" Operation#$ { )onsole.,rite3ine#.)oncrete)omponent.Operation#$.$; // .Decorator. abstract class Decorator 1 )omponent { protecte" )omponent component; public !oi" Set)omponent#)omponent component$ { t4is.component ' component; public o!erri"e !oi" Operation#$ { if #component [' null$ { component.Operation#$; // .)oncreteDecoratorA. class )oncreteDecoratorA 1 Decorator { pri!ate string a""e"State; public o!erri"e !oi" Operation#$ { base.Operation#$; a""e"State ' .6e( State.; )onsole.,rite3ine#.)oncreteDecoratorA.Operation#$.$; // .)oncreteDecorator0. class )oncreteDecorator0 1 Decorator { public o!erri"e !oi" Operation#$ { base.Operation#$; A""e"0e4a!ior#$; )onsole.,rite3ine#.)oncreteDecorator0.Operation#$.$; -

!oi" A""e"0e4a!ior#$ { -

8zlaz
)oncrete)omponent.Operation#$ )oncreteDecoratorA.Operation#$ )oncreteDecorator0.Operation#$

Pri#er i+ st)arnog s)eta


Ovaj primer pokazuje kako obrazac &ecorator ?pozajmljuje@ funkcionalnost postojeim elementima biblioteke.

// Decorator pattern -- /rimer i8 st!arnog s!eta using System; using System.)ollections; namespace DoFactory.GangOfFour.Decorator.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // ?reira kn igu 0ook book ' ne( 0ook #.,orley.K .2nsi"e AS/.6:5.K &H$; book.Display#$; // ?reira !i"eo @i"eo !i"eo ' ne( @i"eo #.Spielberg.K .Va(s.K +AK \+$; !i"eo.Display#$; // Npotrebi patern )onsole.,rite3ine#.>nMaking !i"eo borro(able1.$; 0orro(able borro(!i"eo ' ne( 0orro(able#!i"eo$; borro(!i"eo.0orro(2tem#.)ustomer %&.$; borro(!i"eo.0orro(2tem#.)ustomer %+.$;

borro(!i"eo.Display#$; )onsole.*ea"#$; // .)omponent. abstract class 3ibrary2tem { pri!ate int num)opies; public int 6um)opies { get{ return num)opies; set{ num)opies ' !alue; public abstract !oi" Display#$; // .)oncrete)omponent. class 0ook 1 3ibrary2tem { pri!ate string aut4or; pri!ate string title; // ?onstruktor public 0ook#string aut4orKstring titleKint num)opies$ { t4is.aut4or ' aut4or; t4is.title ' title; t4is.6um)opies ' num)opies; public o!erri"e !oi" Display#$ { )onsole.,rite3ine#.>n0ook ------ .$; )onsole.,rite3ine#. Aut4or1 {H-.K aut4or$; )onsole.,rite3ine#. 5itle1 {H-.K title$; )onsole.,rite3ine#. % )opies1 {H-.K 6um)opies$; // .)oncrete)omponent. class @i"eo 1 3ibrary2tem { pri!ate string "irector; pri!ate string title; pri!ate int play5ime;

// ?onstruktor public @i"eo#string "irectorK string titleK int num)opiesK int play5ime$ { t4is."irector ' "irector; t4is.title ' title; t4is.6um)opies ' num)opies; t4is.play5ime ' play5ime; public o!erri"e !oi" Display#$ { )onsole.,rite3ine#.>n@i"eo ----- .$; )onsole.,rite3ine#. Director1 {H-.K "irector$; )onsole.,rite3ine#. 5itle1 {H-.K title$; )onsole.,rite3ine#. % )opies1 {H-.K 6um)opies$; )onsole.,rite3ine#. /laytime1 {H->n.K play5ime$; // .Decorator. abstract class Decorator 1 3ibrary2tem { protecte" 3ibrary2tem library2tem; // ?onstruktor public Decorator#3ibrary2tem library2tem$ { t4is.library2tem ' library2tem; public o!erri"e !oi" Display#$ { library2tem.Display#$; // .)oncreteDecorator. class 0orro(able 1 Decorator { protecte" Array3ist borro(ers ' ne( Array3ist#$; // )onstructor public 0orro(able#3ibrary2tem library2tem$ 1 base#library2tem$ { public !oi" 0orro(2tem#string name$ { borro(ers.A""#name$; library2tem.6um)opies--;

public !oi" *eturn2tem#string name$ { borro(ers.*emo!e#name$; library2tem.6um)opies77; public o!erri"e !oi" Display#$ { base.Display#$; foreac4 #string borro(er in borro(ers$ { )onsole.,rite3ine#. borro(er1 . 7 borro(er$; -

8zlaz
0ook -----Aut4or1 ,orley 5itle1 2nsi"e AS/.6:5 % )opies1 &H @i"eo ----Director1 Spielberg 5itle1 Va(s % )opies1 +A /laytime1 \+

Making !i"eo borro(able1 @i"eo ----Director1 Spielberg 5itle1 Va(s % )opies1 +& /laytime1 \+ borro(er1 )ustomer %& borro(er1 )ustomer %+

Fasada (Fa'ade)
Definicija
Obezbeuje jedinstveni interfejs ka celom podsistemu. Obrazac #asada definie interfejs na viem nivou koji olakava upotrebu podsistema.

U ! Dijagra# klasa

$le#enti
+lase i6ili objekti koje uestvuju u ovom obrascu su% Faca"e ( ortgage%pplication) o o zna koje klase podsistema treba da pri'vate spoljni za'tev delegira klijentski za'tev odgovarajuem objektu iz podsistema

Subs&ste# classes (Bank' Cre"it' !oan) o o o implementiraju funkcionalnost podsistema obrauju za'teve koji im dolaze od objekta klase #acade nemaju pojma o fasadi i ne uvaju nikakvu referencu na nju

Pri#er ko"a u je+iku C,


Ovaj strukturni kod prikazuje kreiranje uproenog i uniformnog interfejsa ka velikom podsistemu.

// Faca"e pattern -- Strukturni primer using System; namespace DoFactory.GangOfFour.Faca"e.Structural { // MainApp test aplikaci a class MainApp { public static !oi" Main#$ { Faca"e faca"e ' ne( Faca"e#$; faca"e.Met4o"A#$; faca"e.Met4o"0#$; // ,ait for user )onsole.*ea"#$; // .Subsystem )lassA. class SubSystemOne { public !oi" Met4o"One#$ { )onsole.,rite3ine#. SubSystemOne Met4o".$; // Subsystem )lass0. class SubSystem5(o { public !oi" Met4o"5(o#$ { )onsole.,rite3ine#. SubSystem5(o Met4o".$; // Subsystem )lass). class SubSystem54ree

{ public !oi" Met4o"54ree#$ { )onsole.,rite3ine#. SubSystem54ree Met4o".$; // Subsystem )lassD. class SubSystemFour { public !oi" Met4o"Four#$ { )onsole.,rite3ine#. SubSystemFour Met4o".$; // .Faca"e. class Faca"e { SubSystemOne one; SubSystem5(o t(o; SubSystem54ree t4ree; SubSystemFour four; public Faca"e#$ { one ' ne( SubSystemOne#$; t(o ' ne( SubSystem5(o#$; t4ree ' ne( SubSystem54ree#$; four ' ne( SubSystemFour#$; public !oi" Met4o"A#$ { )onsole.,rite3ine#.>nMet4o"A#$ ---- .$; one.Met4o"One#$; t(o.Met4o"5(o#$; four.Met4o"Four#$; public !oi" Met4o"0#$ { )onsole.,rite3ine#.>nMet4o"0#$ ---- .$; t(o.Met4o"5(o#$; t4ree.Met4o"54ree#$; -

8zlaz

Met4o"A#$ ---SubSystemOne Met4o" SubSystem5(o Met4o" SubSystemFour Met4o" Met4o"0#$ ---SubSystem5(o Met4o" SubSystem54ree Met4o"

Pri#er i+ st)arnog s)eta


Ovaj primer pokazuje upotrebu obrasca #acade kao objekta klase -ortgage*pplication !mortgage znai 'ipoteka$ koji obezbeuje uproeni interfejs ka skupu klasa koje imaju ulogu da odrede kreditnu sposobnost klijenta.
// Faca"e pattern -- /rimer i8 st!arnog s!eta using System; namespace DoFactory.GangOfFour.Faca"e.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // Fasa"a Mortgage mortgage ' ne( Mortgage#$; // *aJunan e 4ipoteke 8a kupca )ustomer customer ' ne( )ustomer#.Ann Mc?insey.$; bool eligable ' mortgage.2s:ligible#customerK&+GHHH$; )onsole.,rite3ine#.>n. 7 customer.6ame 7 . 4as been . 7 #eligable R .Appro!e". 1 .*e ecte".$$; // Lekan e na korisniJki unos )onsole.*ea"#$; // .Subsystem )lassA. class 0ank { public bool 9asSufficientSa!ings#)ustomer cK int amount$

{ )onsole.,rite3ine#.)4eck bank for . 7 c.6ame$; return true; // .Subsystem )lass0. class )re"it { public bool 9asGoo")re"it#)ustomer c$ { )onsole.,rite3ine#.)4eck cre"it for . 7 c.6ame$; return true; // .Subsystem )lass). class 3oan { public bool 9as6o0a"3oans#)ustomer c$ { )onsole.,rite3ine#.)4eck loans for . 7 c.6ame$; return true; class )ustomer { pri!ate string name; public )ustomer#string name$ { t4is.name ' name; public string 6ame { get{ return name; // .Faca"e. class Mortgage { pri!ate 0ank bank ' ne( 0ank#$; pri!ate 3oan loan ' ne( 3oan#$; pri!ate )re"it cre"it ' ne( )re"it#$; public bool 2s:ligible#)ustomer custK int amount$ { )onsole.,rite3ine#.{H- applies for {&1)- loan>n.K

cust.6ameK amount$; bool eligible ' true; // /ro!era kre"itne sposobnosti if #[bank.9asSufficientSa!ings#custK amount$$ { eligible ' false; else if #[loan.9as6o0a"3oans#cust$$ { eligible ' false; else if #[cre"it.9asGoo")re"it#cust$$ { eligible ' false; return eligible; -

8zlaz
Ann Mc?insey applies for ]&+GKHHH.HH loan )4eck bank for Ann Mc?insey )4eck loans for Ann Mc?insey )4eck cre"it for Ann Mc?insey Ann Mc?insey 4as been Appro!e"

Superlaki (Fly(ei#ht)
Definicija
+oristi princip deljenja resursa!s'aring$ da bi obezbedio efikasniju podrku veem broju mali' objekata.

U ! Dijagra# klasa

$le#enti
+lase i6ili objekti koje uestvuju u ovom obrascu su% Fl&4eig/t (C/aracter) o deklarie interfejs kroz koji superlaki objekti !fl7=eig'ts$ mogu funkcionisati i kroz neodreena !eAtrinsic$ stanja ConcreteFl&4eig/t (C/aracter%' C/aracterB' 555' C/aracter6) o implementira #l7=eig't interfejs i uve podatke o neodreenim stanjima objekata, ako postoje. Objekti klase (oncrete#l7=eig't moraju biti deljivi !s'arable$. Uns/are"ConcreteFl&4eig/t ( not use" )

nije neop'odno sa sve podklase klase #l7=eig't budu deljive. 8nterfejs klase #l7=eig't omoguava deljenje ali ga ne forsira. <ajedniko svim objektima klase ,ns'ared(oncrete#l7=eig't je da imaju objekte klase (oncrete#l7=eig't u svojoj strukturi.

Fl&4eig/tFactor& (C/aracterFactor&) o o kreira i vodi rauna o ?fl7=eig't@ onjektima obezbeuje da ?fl7=eig't@ objekti budu zaista deljevi. +ada klijent za'teva ?fl7=eig't@ objekat klasa #l7=eig't#actor7 mu prosleuje odgovarajui ?fl7=eig't@, ili kreira jedan takav objekat ako nijedan ne postoji.

Client (Fl&4eig/t%pp) o o uve reference na fl7=eig't objekte proraunava i uva podatke o neodreenim stanjima fl7=eig't objekata

Pri#er ko"a u je+iku C,


Ovaj strukturni kod demonstrira upotrebu #l7=eig't obrasca koji vodi rauna o deljenju relativno malog broja objekata. Ovi objekti su deljeni vie puta od strane vie razliiti' klijenata.
// Fly(eig4t pattern -- Strukturni primer using System; using System.)ollections; namespace DoFactory.GangOfFour.Fly(eig4t.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // /roi8!ol no e;trinsic stan e int e;trinsicstate ' ++; Fly(eig4tFactory f ' ne( Fly(eig4tFactory#$; // *a" sa ra8liJitim fly(eig4t obrascima Fly(eig4t f; ' f.GetFly(eig4t#.<.$; f;.Operation#--e;trinsicstate$; Fly(eig4t fy ' f.GetFly(eig4t#.=.$; fy.Operation#--e;trinsicstate$; Fly(eig4t f8 ' f.GetFly(eig4t#.^.$;

f8.Operation#--e;trinsicstate$; Nns4are")oncreteFly(eig4t fu ' ne( Nns4are")oncreteFly(eig4t#$; fu.Operation#--e;trinsicstate$; // Lekan e na korisniJki unos )onsole.*ea"#$; // .Fly(eig4tFactory. class Fly(eig4tFactory { pri!ate 9as4table fly(eig4ts ' ne( 9as4table#$; // )onstructor public Fly(eig4tFactory#$ { fly(eig4ts.A""#.<.K ne( )oncreteFly(eig4t#$$; fly(eig4ts.A""#.=.K ne( )oncreteFly(eig4t#$$; fly(eig4ts.A""#.^.K ne( )oncreteFly(eig4t#$$; public Fly(eig4t GetFly(eig4t#string key$ { return##Fly(eig4t$fly(eig4tsEkeyF$; // .Fly(eig4t. abstract class Fly(eig4t { public abstract !oi" Operation#int e;trinsicstate$; // .)oncreteFly(eig4t. class )oncreteFly(eig4t 1 Fly(eig4t { public o!erri"e !oi" Operation#int e;trinsicstate$ { )onsole.,rite3ine#.)oncreteFly(eig4t1 . 7 e;trinsicstate$; // .Nns4are")oncreteFly(eig4t. class Nns4are")oncreteFly(eig4t 1 Fly(eig4t { public o!erri"e !oi" Operation#int e;trinsicstate$

{ )onsole.,rite3ine#.Nns4are")oncreteFly(eig4t1 . 7 e;trinsicstate$; -

8zlaz
)oncreteFly(eig4t1 +& )oncreteFly(eig4t1 +H )oncreteFly(eig4t1 &\ Nns4are")oncreteFly(eig4t1 &M

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje kako je relativno mali broj karaktera !('aracter$ deljen mnogo puta od strane dokumenta koji je zapravo sainjen od mnogo karaktera.
// Fly(eig4t pattern -- /rimer i8 st!arnog s!eta using System; using System.)ollections; namespace DoFactory.GangOfFour.Fly(eig4t.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // 0uil" a "ocument (it4 te;t string "ocument ' .AA^^00^0.; c4arEF c4ars ' "ocument.5o)4arArray#$; )4aracterFactory f ' ne( )4aracterFactory#$; // e;trinsic state int pointSi8e ' &H; // For eac4 c4aracter use a fly(eig4t ob ect foreac4 #c4ar c in c4ars$ { pointSi8e77; )4aracter c4aracter ' f.Get)4aracter#c$; c4aracter.Display#pointSi8e$;

// ,ait for user )onsole.*ea"#$; // .Fly(eig4tFactory. class )4aracterFactory { pri!ate 9as4table c4aracters ' ne( 9as4table#$; public )4aracter Get)4aracter#c4ar key$ { // Nses .la8y initiali8ation. )4aracter c4aracter ' c4aractersEkeyF as )4aracter; if #c4aracter '' null$ { s(itc4 #key$ { case UAU1 c4aracter ' ne( )4aracterA#$; break; case U0U1 c4aracter ' ne( )4aracter0#$; break; //... case U^U1 c4aracter ' ne( )4aracter^#$; break; c4aracters.A""#keyK c4aracter$; return c4aracter; // .Fly(eig4t. abstract class )4aracter { protecte" c4ar symbol; protecte" int (i"t4; protecte" int 4eig4t; protecte" int ascent; protecte" int "escent; protecte" int pointSi8e; public abstract !oi" Display#int pointSi8e$; // .)oncreteFly(eig4t. class )4aracterA 1 )4aracter { // )onstructor public )4aracterA#$ { t4is.symbol ' UAU;

t4is.4eig4t ' &HH; t4is.(i"t4 ' &+H; t4is.ascent ' XH; t4is."escent ' H; public o!erri"e !oi" Display#int pointSi8e$ { t4is.pointSi8e ' pointSi8e; )onsole.,rite3ine#t4is.symbol 7 . #pointsi8e . 7 t4is.pointSi8e 7 .$.$; // .)oncreteFly(eig4t. class )4aracter0 1 )4aracter { // )onstructor public )4aracter0#$ { t4is.symbol ' U0U; t4is.4eig4t ' &HH; t4is.(i"t4 ' &IH; t4is.ascent ' X+; t4is."escent ' H; public o!erri"e !oi" Display#int pointSi8e$ { t4is.pointSi8e ' pointSi8e; )onsole.,rite3ine#t4is.symbol 7 . #pointsi8e . 7 t4is.pointSi8e 7 .$.$; // ... )K DK :K etc. // .)oncreteFly(eig4t. class )4aracter^ 1 )4aracter { // )onstructor public )4aracter^#$ { t4is.symbol ' U^U; t4is.4eig4t ' &HH; t4is.(i"t4 ' &HH; t4is.ascent ' YM; t4is."escent ' H; public o!erri"e !oi" Display#int pointSi8e$

{ t4is.pointSi8e ' pointSi8e; )onsole.,rite3ine#t4is.symbol 7 . #pointsi8e . 7 t4is.pointSi8e 7 .$.$; -

8zlaz
A A ^ ^ 0 0 ^ 0 #pointsi8e #pointsi8e #pointsi8e #pointsi8e #pointsi8e #pointsi8e #pointsi8e #pointsi8e &&$ &+$ &A$ &I$ &G$ &Y$ &X$ &M$

Poslanik (Pro)y)
Definicija
Obezbeuje surogat !place'older$ za objekat koji treba biti kontrolisan.

U ! Dijagra# klasa

$le#enti
+lase i6ili objekti koje uestvuju u ovom obrascu su%

Proxy (MathProxy) o Ao i ra-%na o referenci koja koja proksij% o&2olja2a prist%p ka ;eal5%bject objekt%. 9bjekat Pro8y se "oBe o nositi i na objekat klase 5%bject ako s% interfejsi klasa ;eal5%bject i 5%bject i enti-ni. o 9be&beC%je interfejs i enti-an interfejs% klase 5%bject. U proti2no" objekat Pro8y ne bi "o!ao %2ek a &a"eni objekat 5%bject. o Ao i ra-%na o prist%p% instanci klase ;eal5%bject i "oBe biti o !o2oran &a nje!o2o kreiranje i brisanje. o 9stale o !o2ornosti &a2ise o 2rste proksija( remote proxies s% o !o2orni &a ko iranje &a.te2a i nje!o2i. ar!%"enataD kao i &a slanje o2ako ko irano! &a.te2a realni" objekti"a (;eal5%bjects) koji se nala&e % ra&li-iti" a resni" prostori"a. virtual proxies "o!% -%2ati o atne infor"acije o realni" objekti"a tako a "o!% s"anjiti %-estanost obra=anja.

protection proxies 2o e ra-%na o to"e a li objekat koji i. po&i2a i"a o2oljan ni2o pri2ile!ija a bi se prosle io &a.te2. Subject (IMath) o Defini:e &aje ni-ki interfejs &a klase ;eal5%bject i Pro8yD kako bi Pro8y "o!ao biti %potrebljen s2% a ! e se ;eal5%bject o-ek%je. RealSubject (Math) o Defini:e realne objekte koje repre&ent%je Pro8y objekat.

Pri#er ko"a u je+iku C,


92aj str%kt%rni ko prika&%je obra&ac Pro8y koji kreira objekat koji 2o i ra-%na o prist%p% r%!o" sli-no" objekt%.

// /ro;y pattern -- Strukturni primer using System; namespace DoFactory.GangOfFour./ro;y.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // )reate pro;y an" reWuest a ser!ice /ro;y pro;y ' ne( /ro;y#$; pro;y.*eWuest#$; // ,ait for user )onsole.*ea"#$; // .Sub ect. abstract class Sub ect { public abstract !oi" *eWuest#$; // .*ealSub ect. class *ealSub ect 1 Sub ect { public o!erri"e !oi" *eWuest#$ { )onsole.,rite3ine#.)alle" *ealSub ect.*eWuest#$.$; // ./ro;y.

class /ro;y 1 Sub ect { *ealSub ect realSub ect; public o!erri"e !oi" *eWuest#$ { // Nse Ula8y initiali8ationU if #realSub ect '' null$ { realSub ect ' ne( *ealSub ect#$; realSub ect.*eWuest#$; 28la8 )alle" *ealSub ect.*eWuest#$

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje upotrebu obrasca ProA7 za matematike objekte koji su predstavljeni -at'ProA7 objektom.

// /ro;y pattern -- /rimer i8 st!arnog s!eta using System; namespace DoFactory.GangOfFour./ro;y.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // )reate mat4 pro;y Mat4/ro;y p ' ne( Mat4/ro;y#$; // Do t4e mat4 )onsole.,rite3ine#.I )onsole.,rite3ine#.I )onsole.,rite3ine#.I )onsole.,rite3ine#.I // ,ait for user )onsole.*ea"#$; // .Sub ect. public interface 2Mat4 { 7 _ / + + + + ' ' ' ' . . . . 7 7 7 7 p.A""#IK p.Sub#IK p.Mul#IK p.Di!#IK +$$; +$$; +$$; +$$;

"ouble "ouble "ouble "ouble -

A""#"ouble Sub#"ouble Mul#"ouble Di!#"ouble

;K ;K ;K ;K

"ouble "ouble "ouble "ouble

y$; y$; y$; y$;

// .*ealSub ect. class Mat4 1 2Mat4 { public "ouble A""#"ouble public "ouble Sub#"ouble public "ouble Mul#"ouble public "ouble Di!#"ouble // ./ro;y Ob ect. class Mat4/ro;y 1 2Mat4 { Mat4 mat4; public Mat4/ro;y#$ { mat4 ' ne( Mat4#$; public "ouble A""#"ouble { return mat4.A""#;Ky$; public "ouble Sub#"ouble { return mat4.Sub#;Ky$; public "ouble Mul#"ouble { return mat4.Mul#;Ky$; public "ouble Di!#"ouble { return mat4.Di!#;Ky$; 28la8 I 7 + I - + I _ + I / + ' ' ' ' Y + M + ;K "ouble y$

;K ;K ;K ;K

"ouble "ouble "ouble "ouble

y${return y${return y${return y${return

; ; ; ;

7 _ /

y;y;y;y;-

;K "ouble y$

;K "ouble y$

;K "ouble y$

Obrasci ponaanja (Be/a)ioral Patterns)

$o andni lanac (Chain of *esponsibility)


Definicija
5l%Bi a se na najje nosta2niji na-in prosleC%je ni& s%kcesi2ni. po&i2a. 9bjekat koji :alje &a.te2 treba a po:alje sa"o je an objekat % lanac. Lanac pre%&i"a taj objekat i prosleC%je !a o kona-no! o re i:ta. ;e&%ltat se &ati" pre%&i"a i 2ra=a se lance" objekt% koji je inicirao po&i2.

U ! Dijagra# klasa

$le#enti
Klase iEili objekti koje %-est2%j% % o2o" obrasc% s%(

Handler (Approver) o Defini:e interfejs &a obra % &a.te2a o (opciono) i"ple"entira i"ple"entira operacij% po2e&i2anja ka ele"ent% ko"e se prosleC%je po&i2 ConcreteHandler (Director, icePre!ident, Pre!ident) o 9braC%je &a.te2e koji s% "% %p%=eni o MoBe a prist%pi s2o" sle benik% (ele"ent% ko"e :alje &a.te2) o Ako objekat klase ConcreteFan ler "oBe a obra i &a.te2 ona to i -iniD % s%protno"D prosleC%je &a.te2 s2o" sle benik% % lanc% Client (ChainApp) o <nicira &a.te2 objekt% klase ConcreteFan ler kro& lanac

Pri#er ko"a u je+iku C,92aj str%kt%rni ko prika&%je %potreb% lanca o !o2ornosti ! e nekoliko po2e&ani. objekata (lanac) n% e "o!%=nost a o !o2ore na &a.te2 iliD ako ne "o!%D prosleC%j% !a alje.
// )4ain of *esponsibility -- Strukturni primer using System; namespace DoFactory.GangOfFour.)4ain.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // 2nicira lanac o"go!ornosti 9an"ler 4& ' ne( )oncrete9an"ler&#$; 9an"ler 4+ ' ne( )oncrete9an"ler+#$; 9an"ler 4A ' ne( )oncrete9an"lerA#$; 4&.SetSuccessor#4+$; 4+.SetSuccessor#4A$; // GeneriBe i obra`u e 8a4te! intEF reWuests ' {+K GK &IK ++K &MK AK +XK +H-; foreac4 #int reWuest in reWuests$ { 4&.9an"le*eWuest#reWuest$; )onsole.*ea"#$; // .9an"ler. abstract class 9an"ler { protecte" 9an"ler successor; public !oi" SetSuccessor#9an"ler successor$ { t4is.successor ' successor; public abstract !oi" 9an"le*eWuest#int reWuest$; // .)oncrete9an"ler&. class )oncrete9an"ler& 1 9an"ler { public o!erri"e !oi" 9an"le*eWuest#int reWuest$ { if #reWuest Z' H SS reWuest T &H$ { )onsole.,rite3ine#.{H- 4an"le" reWuest {&-.K

t4is.Get5ype#$.6ameK reWuest$; else if #successor [' null$ { successor.9an"le*eWuest#reWuest$; // .)oncrete9an"ler+. class )oncrete9an"ler+ 1 9an"ler { public o!erri"e !oi" 9an"le*eWuest#int reWuest$ { if #reWuest Z' &H SS reWuest T +H$ { )onsole.,rite3ine#.{H- 4an"le" reWuest {&-.K t4is.Get5ype#$.6ameK reWuest$; else if #successor [' null$ { successor.9an"le*eWuest#reWuest$; // .)oncrete9an"lerA. class )oncrete9an"lerA 1 9an"ler { public o!erri"e !oi" 9an"le*eWuest#int reWuest$ { if #reWuest Z' +H SS reWuest T AH$ { )onsole.,rite3ine#.{H- 4an"le" reWuest {&-.K t4is.Get5ype#$.6ameK reWuest$; else if #successor [' null$ { successor.9an"le*eWuest#reWuest$; 28la8 )oncrete9an"ler& )oncrete9an"ler& )oncrete9an"ler+ )oncrete9an"lerA )oncrete9an"ler+ )oncrete9an"ler& )oncrete9an"lerA )oncrete9an"lerA 4an"le" 4an"le" 4an"le" 4an"le" 4an"le" 4an"le" 4an"le" 4an"le" reWuest reWuest reWuest reWuest reWuest reWuest reWuest reWuest + G &I ++ &M A +X +H

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje upotrebu obrasca ('ain of .esponsibilit7 gde nekoliko rukovodioca !'ijerar'ijski ureeni'$ mogu ili da odgovore na narudbinu ili da je proslede svom pretpostavljenom. 0vaka pozicija moe imati svoj skup pravila na osnovu koji' obrauje za'teve.
// )4ain of *esponsibility -- /rimer i8 st!arnog s!eta using System; namespace DoFactory.GangOfFour.)4ain.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // 2nici ali8aci a e"nog a)4ain of *esponsibilityP Director 3arry ' ne( Director#$; @ice/resi"ent Sam ' ne( @ice/resi"ent#$; /resi"ent 5ammy ' ne( /resi"ent#$; 3arry.SetSuccessor#Sam$; Sam.SetSuccessor#5ammy$; // GeneriBi i obra"i 8a4te!e /urc4ase p ' ne( /urc4ase#+HAIK AGH.HHK .Supplies.$; 3arry./rocess*eWuest#p$; p ' ne( /urc4ase#+HAGK A+G\H.&HK ./ro ect <.$; 3arry./rocess*eWuest#p$; p ' ne( /urc4ase#+HAYK &++&HH.HHK ./ro ect =.$; 3arry./rocess*eWuest#p$; // Jekan e na korisnika )onsole.*ea"#$; // .9an"ler. abstract class Appro!er { protecte" Appro!er successor; public !oi" SetSuccessor#Appro!er successor$ { t4is.successor ' successor; public abstract !oi" /rocess*eWuest#/urc4ase purc4ase$; // .)oncrete9an"ler. class Director 1 Appro!er {

public o!erri"e !oi" /rocess*eWuest#/urc4ase purc4ase$ { if #purc4ase.Amount T &HHHH.H$ { )onsole.,rite3ine#.{H- appro!e" reWuest% {&-.K t4is.Get5ype#$.6ameK purc4ase.6umber$; else if #successor [' null$ { successor./rocess*eWuest#purc4ase$; // .)oncrete9an"ler. class @ice/resi"ent 1 Appro!er { public o!erri"e !oi" /rocess*eWuest#/urc4ase purc4ase$ { if #purc4ase.Amount T +GHHH.H$ { )onsole.,rite3ine#.{H- appro!e" reWuest% {&-.K t4is.Get5ype#$.6ameK purc4ase.6umber$; else if #successor [' null$ { successor./rocess*eWuest#purc4ase$; // .)oncrete9an"ler. class /resi"ent 1 Appro!er { public o!erri"e !oi" /rocess*eWuest#/urc4ase purc4ase$ { if #purc4ase.Amount T &HHHHH.H$ { )onsole.,rite3ine#.{H- appro!e" reWuest% {&-.K t4is.Get5ype#$.6ameK purc4ase.6umber$; else { )onsole.,rite3ine# .*eWuest% {H- reWuires an e;ecuti!e meeting[.K purc4ase.6umber$; // *eWuest "etails class /urc4ase { pri!ate int number; pri!ate "ouble amount; pri!ate string purpose; // )onstructor public /urc4ase#int numberK "ouble amountK string purpose$ {

t4is.number ' number; t4is.amount ' amount; t4is.purpose ' purpose; // /roperties public "ouble Amount { get{ return amount; set{ amount ' !alue; public string /urpose { get{ return purpose; set{ purpose ' !alue; public int 6umber { get{ return number; set{ number ' !alue; 28la8 Director 3arry appro!e" reWuest% +HAI /resi"ent 5ammy appro!e" reWuest% +HAG *eWuest% +HAY reWuires an e;ecuti!e meeting[

$o anda (Co
Definicija

and)

#nkaps%lira &a.te2 kao objekat :to o"o!%=%je para"etri&acij% klijenta ra&li-iti" &a.te2i"aD ni&o2i"a por%ka i o"o!%=a2a reali&acij% operacija na koji"a je "o!%=e i&2r:iti G%n oH operacij%.

U ! Dijagra# klasa

$le#enti
Klase iEili objekti koje %-est2%j% % o2o" obrasc% s%(

Co""and (Co""and) o Deklari:e interfejs &a i&2r:enje operacija ConcreteCo""and (CalculatorCo""and) o Defini:e 2e&% i&"eC% objekta klase ;ecei2er i akcije koja "% se %p%=%je o <"ple"etira G#8ec%teH "eto e po&i2aj%=i o !o2araj%=e operacije % klasi ;ecei2er Client (Co""andApp) o Kreira objekat klase ConcreteCo""an i posta2lja objekat koji =e pri.2atiti nje!o2e po&i2e (;ecei2er) Invo#er ($!er) o @raBi a "% ko"an a obra i &a.te2

Receiver (Calculator) o Ina kako a i&2r:a2a operacije koje s% po2e&ane sa &a.te2i"a

Pri#er ko"a u je+iku C,


92aj str%kt%rni ko prika&%je %potreb% obrasca Co""an koji -%2a &a.te2e kao objekte koji klijent% o"o!%=a2aj% i&2r:enje ili opo&i2anje &a.te2a.

// )omman" pattern -- Strukturni primer using System; namespace DoFactory.GangOfFour.)omman".Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { *ecei!er recei!er ' ne( *ecei!er#$; )omman" comman" ' ne( )oncrete)omman"#recei!er$; 2n!oker in!oker ' ne( 2n!oker#$; // 2nicira i i8!rBa!a koman"u in!oker.Set)omman"#comman"$; in!oker.:;ecute)omman"#$; )onsole.*ea"#$; // .)omman". abstract class )omman" { protecte" *ecei!er recei!er; // )onstructor public )omman"#*ecei!er recei!er$ { t4is.recei!er ' recei!er; public abstract !oi" :;ecute#$; // .)oncrete)omman". class )oncrete)omman" 1 )omman" { // )onstructor public )oncrete)omman"#*ecei!er recei!er$ 1 base#recei!er$

{ public o!erri"e !oi" :;ecute#$ { recei!er.Action#$; // .*ecei!er. class *ecei!er { public !oi" Action#$ { )onsole.,rite3ine#.)alle" *ecei!er.Action#$.$; // .2n!oker. class 2n!oker { pri!ate )omman" comman"; public !oi" Set)omman"#)omman" comman"$ { t4is.comman" ' comman"; public !oi" :;ecute)omman"#$ { comman".:;ecute#$; 28la8 )alle" *ecei!er.Action#$

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje obrazac (ommand upotrebljen za unapreenje jednostavnog kalkulatora, na taj nain to omoguuje neogranien broj ?undo@ i ?redo@ operacija. Obratite panju da je u jeziku () ?operator@ kljuna re, a da smo ga mi iskoristili kao promenljivu tako to smo ispred njega stavili znak BCB .

// )omman" pattern -- /rimer i8 st!arnog s!eta using System; using System.)ollections; namespace DoFactory.GangOfFour.)omman".*eal,orl" { // MainApp test aplikaci a

class MainApp { static !oi" Main#$ { // )reate user an" let 4er compute Nser user ' ne( Nser#$; user.)ompute#U7UK user.)ompute#U-UK user.)ompute#U_UK user.)ompute#U/UK // Nn"o I comman"s user.Nn"o#I$; // *e"o A comman"s user.*e"o#A$; // ,ait for user )onsole.*ea"#$; // .)omman". abstract class )omman" { public abstract !oi" :;ecute#$; public abstract !oi" Nn:;ecute#$; // .)oncrete)omman". class )alculator)omman" 1 )omman" { c4ar boperator; int operan"; )alculator calculator; // )onstructor public )alculator)omman"#)alculator calculatorK c4ar boperatorK int operan"$ { t4is.calculator ' calculator; t4is.boperator ' boperator; t4is.operan" ' operan"; public c4ar Operator { set{ boperator ' !alue; public int Operan" { set{ operan" ' !alue; public o!erri"e !oi" :;ecute#$ { calculator.Operation#boperatorK operan"$; &HH$; GH$; &H$; +$;

public o!erri"e !oi" Nn:;ecute#$ { calculator.Operation#Nn"o#boperator$K operan"$; // /ri!ate 4elper function pri!ate c4ar Nn"o#c4ar boperator$ { c4ar un"o; s(itc4#boperator$ { case U7U1 un"o ' U-U; break; case U-U1 un"o ' U7U; break; case U_U1 un"o ' U/U; break; case U/U1 un"o ' U_U; break; "efault 1 un"o ' U U; break; return un"o; // .*ecei!er. class )alculator { pri!ate int curr ' H; public !oi" Operation#c4ar boperatorK int operan"$ { s(itc4#boperator$ { case U7U1 curr 7' operan"; break; case U-U1 curr -' operan"; break; case U_U1 curr _' operan"; break; case U/U1 curr /' operan"; break; )onsole.,rite3ine# .)urrent !alue ' {HKA- #follo(ing {&- {+-$.K currK boperatorK operan"$; // .2n!oker. class Nser { // 2nitiali8ers pri!ate )alculator calculator ' ne( )alculator#$; pri!ate Array3ist comman"s ' ne( Array3ist#$; pri!ate int current ' H; public !oi" *e"o#int le!els$ { )onsole.,rite3ine#.>n---- *e"o {H- le!els .K le!els$; // /erform re"o operations for #int i ' H; i T le!els; i77$ { if #current T comman"s.)ount - &$ { )omman" comman" ' comman"sEcurrent77F as )omman"; comman".:;ecute#$; -

public !oi" Nn"o#int le!els$ { )onsole.,rite3ine#.>n---- Nn"o {H- le!els .K le!els$; // /erform un"o operations for #int i ' H; i T le!els; i77$ { if #current Z H$ { )omman" comman" ' comman"sE--currentF as )omman"; comman".Nn:;ecute#$; public !oi" )ompute#c4ar boperatorK int operan"$ { // )reate comman" operation an" e;ecute it )omman" comman" ' ne( )alculator)omman"# calculatorK boperatorK operan"$; comman".:;ecute#$; // A"" comman" to un"o list comman"s.A""#comman"$; current77; 28la8 )urrent )urrent )urrent )urrent !alue !alue !alue !alue ' &HH #follo(ing 7 &HH$ ' GH #follo(ing - GH$ ' GHH #follo(ing _ &H$ ' +GH #follo(ing / +$ #follo(ing #follo(ing #follo(ing #follo(ing _ / 7 +$ &H$ GH$ &HH$

---- Nn"o I le!els )urrent !alue ' GHH )urrent !alue ' GH )urrent !alue ' &HH )urrent !alue ' H

---- *e"o A le!els )urrent !alue ' &HH #follo(ing 7 &HH$ )urrent !alue ' GH #follo(ing - GH$ )urrent !alue ' GHH #follo(ing _ &H$

+nterpretator (+nterpreter)
Definicija
5l%Bi a &a ati je&ikD efini:e repre&entacij% nje!o2e !ra"atike &aje no sa pra2ili"a interpretiranja re-enica.

U ! Dijagra# klasa

$le#enti
Klase iEili objekti koje %-est2%j% % o2o" obrasc% s%(

Ab!tract%xpre!!ion (%xpre!!ion) o Deklari:e interfejs &a i&2r:enje operacija &er"inal%xpre!!ion ( &hou!and%xpre!!ion, Hundred%xpre!!ion, &en%xpre!!ion, 'ne%xpre!!ion ) o <"ple"entira operacij% <nterpret koja je asocirana %& ter"inalne si"bole !ra"atike. o Ia s2aki ter"inalni si"bol potrebna je po je na instanca ter"inalno! si"bola i& re-enice. (onter"inal%xpre!!ion ( not u!ed ) o Po je na o2ak2a klasa je potrebna &a s2ako o pra2ila tipa ; ((J ;+;/...;n koje postoji % !ra"atici o Ao i ra-%na o instanca"a tipa Abstract#8pression &a s2aki o ;Ko2a (;+...;n. ) o <"ple"entira operacij% <nterpret &a neter"inalne si"bole % !ra"atici. <nterpretacija tipi-no &o2e sebe sa"% rek%r&i2no &a s2aki o ;Ko2a.

Context (Context) o 5a rBi !lobalne infor"acije potrebne interpretator% Client (InterpreterApp) o )ra i apstraktno sintaksno stablo koje pre sta2lja o reCen% re-enic% % je&ik% koji je efinisan !ra"atiko". Po"en%to sintaksno stablo je sa-injeno o instanca klasa >onter"inal#8pression i @er"inal#8pression. o Po&i2a operacij% <nterpret

Pri#er ko"a u je+iku C,


92aj str%kt%rni pri"er pre sta2lja %potreb% obrasca <nterpreter &a re-enice (iska&e) kreirane na osno2% o reCene !ra"atike.

// 2nterpreter pattern -- Strukturni primer using System; using System.)ollections; namespace DoFactory.GangOfFour.2nterpreter.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { )onte;t conte;t ' ne( )onte;t#$; // Nsually a tree Array3ist list ' ne( Array3ist#$; // /opulate Uabstract synta; treeU list.A""#ne( 5erminal:;pression#$$; list.A""#ne( 6onterminal:;pression#$$; list.A""#ne( 5erminal:;pression#$$; list.A""#ne( 5erminal:;pression#$$; // 2nterpret foreac4 #Abstract:;pression e;p in list$ { e;p.2nterpret#conte;t$; // ,ait for user )onsole.*ea"#$; // .)onte;t. class )onte;t { -

// .Abstract:;pression. abstract class Abstract:;pression { public abstract !oi" 2nterpret#)onte;t conte;t$; // .5erminal:;pression. class 5erminal:;pression 1 Abstract:;pression { public o!erri"e !oi" 2nterpret#)onte;t conte;t$ { )onsole.,rite3ine#.)alle" 5erminal.2nterpret#$.$; // .6onterminal:;pression. class 6onterminal:;pression 1 Abstract:;pression { public o!erri"e !oi" 2nterpret#)onte;t conte;t$ { )onsole.,rite3ine#.)alle" 6onterminal.2nterpret#$.$; 28la8 )alle" )alle" )alle" )alle" 5erminal.2nterpret#$ 6onterminal.2nterpret#$ 5erminal.2nterpret#$ 5erminal.2nterpret#$

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje upotrebu obrasca 8nterpreter koji je upotrebljen za konverziju rimski' u arapske brojeva.

// 2nterpreter pattern -- /rimer i8 st!arnog s!eta using System; using System.)ollections; namespace DoFactory.GangOfFour.2nterpreter.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { string roman ' .M)M<<@222.; )onte;t conte;t ' ne( )onte;t#roman$;

// 0uil" t4e Uparse treeU Array3ist tree ' ne( Array3ist#$; tree.A""#ne( 54ousan":;pression#$$; tree.A""#ne( 9un"re":;pression#$$; tree.A""#ne( 5en:;pression#$$; tree.A""#ne( One:;pression#$$; // 2nterpret foreac4 #:;pression e;p in tree$ { e;p.2nterpret#conte;t$; )onsole.,rite3ine#.{H- ' {&-.K romanK conte;t.28la8$; // ,ait for user )onsole.*ea"#$; // .)onte;t. class )onte;t { pri!ate string input; pri!ate int 28la8; // )onstructor public )onte;t#string input$ { t4is.input ' input; // /roperties public string 2nput { get{ return input; set{ input ' !alue; public int 28la8 { get{ return 28la8; set{ 28la8 ' !alue; // .Abstract:;pression. abstract class :;pression { public !oi" 2nterpret#)onte;t conte;t$ { if #conte;t.2nput.3engt4 '' H$ return; if #conte;t.2nput.Starts,it4#6ine#$$$ { conte;t.28la8 7' #\ _ Multiplier#$$; conte;t.2nput ' conte;t.2nput.Substring#+$; else if #conte;t.2nput.Starts,it4#Four#$$$

{ conte;t.28la8 7' #I _ Multiplier#$$; conte;t.2nput ' conte;t.2nput.Substring#+$; else if #conte;t.2nput.Starts,it4#Fi!e#$$$ { conte;t.28la8 7' #G _ Multiplier#$$; conte;t.2nput ' conte;t.2nput.Substring#&$; (4ile #conte;t.2nput.Starts,it4#One#$$$ { conte;t.28la8 7' #& _ Multiplier#$$; conte;t.2nput ' conte;t.2nput.Substring#&$; public public public public public // 54ousan" c4ecks for t4e *oman 6umeral M // .5erminal:;pression. class 54ousan":;pression 1 :;pression { public o!erri"e string One#$ { return .M.; public o!erri"e string Four#${ return . .; public o!erri"e string Fi!e#${ return . .; public o!erri"e string 6ine#${ return . .; public o!erri"e int Multiplier#$ { return &HHH; // 9un"re" c4ecks )K )DK D or )M // .5erminal:;pression. class 9un"re":;pression 1 :;pression { public o!erri"e string One#$ { return .).; public o!erri"e string Four#${ return .)D.; public o!erri"e string Fi!e#${ return .D.; public o!erri"e string 6ine#${ return .)M.; public o!erri"e int Multiplier#$ { return &HH; // 5en c4ecks for <K <3K 3 an" <) // .5erminal:;pression. class 5en:;pression 1 :;pression { public o!erri"e string One#$ { return .<.; public o!erri"e string Four#${ return .<3.; public o!erri"e string Fi!e#${ return .3.; public o!erri"e string 6ine#${ return .<).; public o!erri"e int Multiplier#$ { return &H; // One c4ecks for 2K 22K 222K 2@K @K @2K @2K @22K @222K 2< // .5erminal:;pression. abstract abstract abstract abstract abstract string One#$; string Four#$; string Fi!e#$; string 6ine#$; int Multiplier#$;

class One:;pression 1 :;pression { public o!erri"e string One#$ { return .2.; public o!erri"e string Four#${ return .2@.; public o!erri"e string Fi!e#${ return .@.; public o!erri"e string 6ine#${ return .2<.; public o!erri"e int Multiplier#$ { return &; 28la8 M)M<<@222 ' &\+M

Broja (+terator)
Definicija
9be&beC%je sek2encijalni prist%p ele"enti"a objekta nastalo! a!re!acijo" (Gni&olikiH objekat) be& potrebe &a prist%panje" nje!o2oj st2arnoj repre&entaciji.

U ! Dijagra# klasa

$le#enti
Klase iEili objekti koje %-est2%j% % o2o" obrasc% s%(

Iterator (Ab!tractIterator) o Defini:e interfejs &a prist%panje ele"enti"a i kretanje o je no! o r%!o! ConcreteIterator (Iterator) o <"ple"entira interfejs klase <terator o Ao i ra-%na o po&iciji tek%=e! ele"enta % a!re!aciji (ni&%) A))re)ate (Ab!tractCollection) o Defini:e interfejs &a kreiranje objekata klase <terator ConcreteA))re)ate (Collection) o <"ple"etira interfejs &a kreiranje <terator objekata i 2ra=a reference na o !o2araj%=e Concrete<terator objekte

Pri#er ko"a u je+iku C,


92aj str%kt%rni ko prika&%je %potreb% obrasca <terator koji o"o!%=%je prist%panje ra&li-iti" ele"enti"a kolekcije be& 2oCenja ra-%na o njenoj %n%tra:njoj str%kt%ri.

// 2terator pattern -- Strukturni primer using System; using System.)ollections; namespace DoFactory.GangOfFour.2terator.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { )oncreteAggregate a ' ne( )oncreteAggregate#$; aEHF ' .2tem A.; aE&F ' .2tem 0.; aE+F ' .2tem ).; aEAF ' .2tem D.; // )reate 2terator an" pro!i"e aggregate )oncrete2terator i ' ne( )oncrete2terator#a$; )onsole.,rite3ine#.2terating o!er collection1.$; ob ect item ' i.First#$; (4ile #item [' null$ { )onsole.,rite3ine#item$; item ' i.6e;t#$; // ,ait for user )onsole.*ea"#$; // .Aggregate. abstract class Aggregate { public abstract 2terator )reate2terator#$; // .)oncreteAggregate. class )oncreteAggregate 1 Aggregate { pri!ate Array3ist items ' ne( Array3ist#$; public o!erri"e 2terator )reate2terator#$ { return ne( )oncrete2terator#t4is$; -

// /roperty public int )ount { get{ return items.)ount; // 2n"e;er public ob ect t4isEint in"e;F { get{ return itemsEin"e;F; set{ items.2nsert#in"e;K !alue$; // .2terator. abstract { public public public public class 2terator abstract abstract abstract abstract ob ect First#$; ob ect 6e;t#$; bool 2sDone#$; ob ect )urrent2tem#$;

// .)oncrete2terator. class )oncrete2terator 1 2terator { pri!ate )oncreteAggregate aggregate; pri!ate int current ' H; // )onstructor public )oncrete2terator#)oncreteAggregate aggregate$ { t4is.aggregate ' aggregate; public o!erri"e ob ect First#$ { return aggregateEHF; public o!erri"e ob ect 6e;t#$ { ob ect ret ' null; if #current T aggregate.)ount - &$ { ret ' aggregateE77currentF; return ret; public o!erri"e ob ect )urrent2tem#$ { return aggregateEcurrentF; public o!erri"e bool 2sDone#$ { return current Z' aggregate.)ount R true 1 false ; -

28la8 2terating o!er collection1 2tem A 2tem 0 2tem ) 2tem D

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje upotrebu obrasca 8terator koji slui za prolaenje kroz lanove kolekcije tako to preskae odgovarajui broj njeni' lanova u svakom prolazu.

// 2terator pattern -- /rimer i8 st!arnog s!eta using System; using System.)ollections; namespace DoFactory.GangOfFour.2terator.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // 0uil" a collection )ollection collection ' ne( )ollection#$; collectionEHF ' ne( 2tem#.2tem H.$; collectionE&F ' ne( 2tem#.2tem &.$; collectionE+F ' ne( 2tem#.2tem +.$; collectionEAF ' ne( 2tem#.2tem A.$; collectionEIF ' ne( 2tem#.2tem I.$; collectionEGF ' ne( 2tem#.2tem G.$; collectionEYF ' ne( 2tem#.2tem Y.$; collectionEXF ' ne( 2tem#.2tem X.$; collectionEMF ' ne( 2tem#.2tem M.$; // )reate iterator 2terator iterator ' ne( 2terator#collection$; // Skip e!ery ot4er item iterator.Step ' +; )onsole.,rite3ine#.2terating o!er collection1.$; for#2tem item ' iterator.First#$; [iterator.2sDone; item ' iterator.6e;t#$$ { )onsole.,rite3ine#item.6ame$; // ,ait for user )onsole.*ea"#$; -

class 2tem { string name; // )onstructor public 2tem#string name$ { t4is.name ' name; // /roperty public string 6ame { get{ return name; // .Aggregate. interface 2Abstract)ollection { 2terator )reate2terator#$; // .)oncreteAggregate. class )ollection 1 2Abstract)ollection { pri!ate Array3ist items ' ne( Array3ist#$; public 2terator )reate2terator#$ { return ne( 2terator#t4is$; // /roperty public int )ount { get{ return items.)ount; // 2n"e;er public ob ect t4isEint in"e;F { get{ return itemsEin"e;F; set{ items.A""#!alue$; // .2terator. interface 2Abstract2terator { 2tem First#$; 2tem 6e;t#$; bool 2sDone{ get; 2tem )urrent2tem{ get; // .)oncrete2terator.

class 2terator 1 2Abstract2terator { pri!ate )ollection collection; pri!ate int current ' H; pri!ate int step ' &; // )onstructor public 2terator#)ollection collection$ { t4is.collection ' collection; public 2tem First#$ { current ' H; return collectionEcurrentF as 2tem; public 2tem 6e;t#$ { current 7' step; if #[2sDone$ return collectionEcurrentF as 2tem; else return null; // /roperties public int Step { get{ return step; set{ step ' !alue; public 2tem )urrent2tem { get { return collectionEcurrentF as 2tem; public bool 2sDone { get { return current Z' collection.)ount R true 1 false; 28la8 2terating o!er collection1 2tem H 2tem + 2tem I 2tem Y 2tem M

Posrednik (!ediator)
Definicija
Defini:e objekat koji enkaps%lira na-in &a interakcij% i&"eC% sk%pa objekata. 9bra&ac Me iator o-%2a2a slab% 2e&% 2o e=i ra-%na o to"e a objekti i& po"en%to! sk%pa eksplicitno ne pa"te reference je ni na r%!e. @akoCeD o2aj obra&ac o&2olja2a objekti"a sk%pa a ne&a2isno "enjaj% "eC%sobne 2e&e po koji"a intera!%j%.

U ! Dijagra# klasa

$le#enti
Klase iEili objekti koje %-est2%j% % o2o" obrasc% s%(

Mediator (IChatroo") o Defini:e interfejs &a ko"%nikacij% "eC% objekti"a klase Collea!%e ConcreteMediator (Chatroo") o <"ple"entira "e.ani&"e kooperati2no! pona:anja i koorini:e objekte klase Collea!%e Collea)ue cla!!e! (Participant) o 52aka Collea!%e klasa &na s2oj Me iator objekat o 52aka instanca klase Collea!%e ko"%nicira sa"o sa s2oji" posre niko" be& ob&ira a li ko"%nicira sa r%!i" instanca"a klase Collea!%e ili ne

Pri#er ko"a u je+iku C,


92aj str%kt%rni ko prika&%je obra&ac Me iator kao centralni ele"enta kro& koji se oba2ljaj% s2e ko"%nikacije "eC% objekti"a.
// Me"iator pattern -- Strukturni primer using System;

using System.)ollections; namespace DoFactory.GangOfFour.Me"iator.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { )oncreteMe"iator m ' ne( )oncreteMe"iator#$; )oncrete)olleague& c& ' ne( )oncrete)olleague&#m$; )oncrete)olleague+ c+ ' ne( )oncrete)olleague+#m$; m.)olleague& ' c&; m.)olleague+ ' c+; c&.Sen"#.9o( are youR.$; c+.Sen"#.FineK t4anks.$; // ,ait for user )onsole.*ea"#$; // .Me"iator. abstract class Me"iator { public abstract !oi" Sen"#string messageK )olleague colleague$; // .)oncreteMe"iator. class )oncreteMe"iator 1 Me"iator { pri!ate )oncrete)olleague& colleague&; pri!ate )oncrete)olleague+ colleague+; public )oncrete)olleague& )olleague& { set{ colleague& ' !alue; public )oncrete)olleague+ )olleague+ { set{ colleague+ ' !alue; public o!erri"e !oi" Sen"#string messageK )olleague colleague$ { if #colleague '' colleague&$ { colleague+.6otify#message$; else { colleague&.6otify#message$; -

// .)olleague. abstract class )olleague { protecte" Me"iator me"iator; // )onstructor public )olleague#Me"iator me"iator$ { t4is.me"iator ' me"iator; // .)oncrete)olleague&. class )oncrete)olleague& 1 )olleague { // )onstructor public )oncrete)olleague&#Me"iator me"iator$ 1 base#me"iator$ { public !oi" Sen"#string message$ { me"iator.Sen"#messageK t4is$; public !oi" 6otify#string message$ { )onsole.,rite3ine#.)olleague& gets message1 . 7 message$; // .)oncrete)olleague+. class )oncrete)olleague+ 1 )olleague { // )onstructor public )oncrete)olleague+#Me"iator me"iator$ 1 base#me"iator$ { public !oi" Sen"#string message$ { me"iator.Sen"#messageK t4is$; public !oi" 6otify#string message$ { )onsole.,rite3ine#.)olleague+ gets message1 . 7 message$; 28la8 )olleague+ gets message1 9o( are youR

)olleague& gets message1 FineK t4anks

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje kako obrazac -ediator obezbeuje slabo povezanu komunikaciju svi' instanci klase 1lements koje su registrovane u okviru jedne instance klase ('atroom. ('atroom je centralno mesto kroz koje tee svaka vrsta komunikacije. Ovde je implementirana samo jedan : jedan komunikacija, ali je trivijalno prepraviti ('atroom da obezbeuje komunikaciju vie : vie.

// Me"iator pattern -- /rimer i8 st!arnog s!eta using System; using System.)ollections; namespace DoFactory.GangOfFour.Me"iator.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // )reate c4atroom )4atroom c4atroom ' ne( )4atroom#$; // )reate :lementi an" register t4em /articipant George ' ne( 0eatle#.George.$; /articipant /aul ' ne( 0eatle#./aul.$; /articipant *ingo ' ne( 0eatle#.*ingo.$; /articipant Vo4n ' ne( 0eatle#.Vo4n.$ ; /articipant =oko ' ne( 6on0eatle#.=oko.$; c4atroom.*egister#George$; c4atroom.*egister#/aul$; c4atroom.*egister#*ingo$; c4atroom.*egister#Vo4n$; c4atroom.*egister#=oko$; // )4atting :lementi =oko.Sen" #.Vo4n.K .9i Vo4n[.$; /aul.Sen" #.*ingo.K .All you nee" is lo!e.$; *ingo.Sen"#.George.K .My s(eet 3or".$; /aul.Sen" #.Vo4n.K .)anUt buy me lo!e.$; Vo4n.Sen" #.=oko.K .My s(eet lo!e.$ ; // ,ait for user )onsole.*ea"#$; // .Me"iator. abstract class Abstract)4atroom { public abstract !oi" *egister#/articipant participant$;

public abstract !oi" Sen"# string fromK string toK string message$; // .)oncreteMe"iator. class )4atroom 1 Abstract)4atroom { pri!ate 9as4table :lementi ' ne( 9as4table#$; public o!erri"e !oi" *egister#/articipant participant$ { if #:lementiEparticipant.6ameF '' null$ { :lementiEparticipant.6ameF ' participant; participant.)4atroom ' t4is; public o!erri"e !oi" Sen"# string fromK string toK string message$ { /articipant pto ' #/articipant$:lementiEtoF; if #pto [' null$ { pto.*ecei!e#fromK message$; // .Abstract)olleague. class /articipant { pri!ate )4atroom c4atroom; pri!ate string name; // )onstructor public /articipant#string name$ { t4is.name ' name; // /roperties public string 6ame { get{ return name; public )4atroom )4atroom { set{ c4atroom ' !alue; get{ return c4atroom; public !oi" Sen"#string toK string message$ { c4atroom.Sen"#nameK toK message$; public !irtual !oi" *ecei!e# string fromK string message$

{ )onsole.,rite3ine#.{H- to {&-1 U{+-U.K fromK 6ameK message$; //. )oncrete)olleague&. class 0eatle 1 /articipant { // )onstructor public 0eatle#string name$ 1 base#name$ { public o!erri"e !oi" *ecei!e#string fromK string message$ { )onsole.,rite#.5o a 0eatle1 .$; base.*ecei!e#fromK message$; //. )oncrete)olleague+. class 6on0eatle 1 /articipant { // )onstructor public 6on0eatle#string name$ 1 base#name$ { public o!erri"e !oi" *ecei!e#string fromK string message$ { )onsole.,rite#.5o a non-0eatle1 .$; base.*ecei!e#fromK message$; 28la8 5o a 0eatle1 =oko to Vo4n1 U9i Vo4n[U 5o a 0eatle1 /aul to *ingo1 UAll you nee" is lo!eU 5o a 0eatle1 *ingo to George1 UMy s(eet 3or"U 5o a 0eatle1 /aul to Vo4n1 U)anUt buy me lo!eU 5o a non-0eatle1 Vo4n to =oko1 UMy s(eet lo!eU

Podse,anje (!e ento)


Definicija
*e& nar%:a2anja enkaps%lacijeD .2ata i -%2a interno stanje objekta kako bi oni kasnije "o!li biti 2ra=eni % sa-%2ano stanje.

U ! Dijagra# klasa

$le#enti
Klase iEili objekti koje %-est2%j% % o2o" obrasc% s%(

Me"ento (Me"ento) o L%2a interno stanje objekta klase 9ri!inator. Me"ento treba a sa-%2a o2oljno po ataka o stanj% objekta 9ri!inator kako bi o"o!%=io nje!o2% kasnij% resta%racij%. o L%2a objekte klase 9ri!inator o neBeljeno! "enjanja. Me"ento &apra2o i"a 2a interfejsaD je an pre"a klasi Caretaker i je an pre"a klasi 9ri!inator. Klasa Caretaker 2i i %&an interfejs pre"a objekt% klase Me"ento M ona &apra2o sa"o "oBe a prosle i je an Me"ento objekat r%!i" objekti"a. 5 r%!e straneD 9ri!inator 2i i :irok interfejs koji "% o"o!%=%je a posta2i 2re nosti s2i. neop.o ni. polja koja =e "% o"o!%=iti kasnij% resta%racij%. U i ealno" sl%-aj% sa"o =e 9ri!inator koji je kreirao Me"ento "o=i a prist%pi "e"ento2o" %n%tra:nje" stanj%. 'ri)inator (Sale!Pro!pect) o Kreira Me"ento koji sa rBi sni"ak nje!o2o! tren%tno! stanja o Koristi Me"ento a rest%rira s2oje %n%tra:nje stanje Careta#er (Careta#er) o Ne o !o2aoran &a Me"ento2o %spe:no -%2anje

>ika a ne ispit%je niti ot2ara sa rBaj Me"ento objekta

Pri#er ko"a u je+iku C,


92aj str%kt%rni ko e"onstrira obra&ac Me"ento koji sl%Bi a pri2re"eno sni"i i oBi2i stanja r%!i. objekata.

// Memento pattern -- Strukturni primer using System; namespace DoFactory.GangOfFour.Memento.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { Originator o ' ne( Originator#$; o.State ' .On.; // Store internal state )aretaker c ' ne( )aretaker#$; c.Memento ' o.)reateMemento#$; // )ontinue c4anging originator o.State ' .Off.; // *estore sa!e" state o.SetMemento#c.Memento$; // ,ait for user )onsole.*ea"#$; // .Originator. class Originator { pri!ate string state; // /roperty public string State { get{ return state; set { state ' !alue; )onsole.,rite3ine#.State ' . 7 state$; public Memento )reateMemento#$ { return #ne( Memento#state$$; -

public !oi" SetMemento#Memento memento$ { )onsole.,rite3ine#.*estoring state1.$; State ' memento.State; // .Memento. class Memento { pri!ate string state; // )onstructor public Memento#string state$ { t4is.state ' state; // /roperty public string State { get{ return state; // .)aretaker. class )aretaker { pri!ate Memento memento; // /roperty public Memento Memento { set{ memento ' !alue; get{ return memento; 28la8 State ' On State ' Off *estoring state1 State ' On

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta demonstrira primenu obrasca -emento koji privremeno snima i pamti stanja objekata klase 0alesProspect.

// Memento pattern -- /rimer i8 st!arnog s!eta using System;

namespace DoFactory.GangOfFour.Memento.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { Sales/rospect s ' ne( Sales/rospect#$; s.6ame ' .6oel !an 9alen.; s./4one ' .#I&+$ +GY-H\\H.; s.0u"get ' +GHHH.H; // Store internal state /rospectMemory m ' ne( /rospectMemory#$; m.Memento ' s.Sa!eMemento#$; // )ontinue c4anging originator s.6ame ' .3eo ,elc4.; s./4one ' .#A&H$ +H\-X&&&.; s.0u"get ' &HHHHHH.H; // *estore sa!e" state s.*estoreMemento#m.Memento$; // ,ait for user )onsole.*ea"#$; // .Originator. class Sales/rospect { pri!ate string name; pri!ate string p4one; pri!ate "ouble bu"get; // /roperties public string 6ame { get{ return name; set { name ' !alue; )onsole.,rite3ine#.6ame1 . 7 name$; public string /4one { get{ return p4one; set { p4one ' !alue; )onsole.,rite3ine#./4one1 . 7 p4one$; public "ouble 0u"get { get{ return bu"get; -

set { bu"get ' !alue; )onsole.,rite3ine#.0u"get1 . 7 bu"get$; public Memento Sa!eMemento#$ { )onsole.,rite3ine#.>nSa!ing state -->n.$; return ne( Memento#nameK p4oneK bu"get$; public !oi" *estoreMemento#Memento memento$ { )onsole.,rite3ine#.>n*estoring state -->n.$; t4is.6ame ' memento.6ame; t4is./4one ' memento./4one; t4is.0u"get ' memento.0u"get; // .Memento. class Memento { pri!ate string name; pri!ate string p4one; pri!ate "ouble bu"get; // )onstructor public Memento#string nameK string p4oneK "ouble bu"get$ { t4is.name ' name; t4is.p4one ' p4one; t4is.bu"get ' bu"get; // /roperties public string 6ame { get{ return name; set{ name ' !alue; public string /4one { get{ return p4one; set{ p4one ' !alue; public "ouble 0u"get { get{ return bu"get; set{ bu"get ' !alue; // .)aretaker. class /rospectMemory { pri!ate Memento memento;

// /roperty public Memento Memento { set{ memento ' !alue; get{ return memento; 28la8 6ame1 6oel !an 9alen /4one1 #I&+$ +GY-H\\H 0u"get1 +GHHH Sa!ing state -6ame1 3eo ,elc4 /4one1 #A&H$ +H\-X&&& 0u"get1 &HHHHHH *estoring state -6ame1 6oel !an 9alen /4one1 #I&+$ +GY-H\\H 0u"get1 +GHHH

-ad%ornik (.bserver)
Definicija
Defini:e &a2isnosti tipa je anK2i:e "eC% ra&li-iti" objekti"a i obe&beC%je a se pro"ena stanja % je no" objekt% a%to"atski reflekt%je % s2i" &a2isni" objekti"a.

U ! Dijagra# klasa

$le#enti
Klase iEili objekti koje %-est2%j% % o2o" obrasc% s%(

Subject (Stoc#) o -%2a referenc% pre"a s2o" na &ornik%. Ne an objekat "oBe a i"a i 2i:e 9bser2er objekata. o obe&beC%je interfejs &a o a2anje i %klanjanje 9bser2er objekata. ConcreteSubject (I*M) o -%2a stanje koje =e biti o interesa Concrete9bser2er objekti"a o :alje notifikacij% s2oji" na &ornici"a ka a pro"eni stanje 'b!erver (IInve!tor) o efini:e interfejs &a aB%riranje objekata nakon :to se % objekti"a klase 5%bject esi pro"ena Concrete'b!erver (Inve!tor) o -%2a referenc% na Concrete5%bject objekte o -%2a stanje koje treba a ostane kon&istentno sa stanje" ro iteljske klase

i"ple"entira interfejs &a aB%riranje objekata koji je efinisan % klasi 9bser2er.

Pri#er ko"a u je+iku C,


92aj str%kt%rni ko prika&%je %potreb% obrasca 9bser2er ! e se re!istro2ani objekti o&na-a2aj% a &ati" i aB%riraj% ka a se pro"eni stanje.

// Obser!er pattern -- Strukturni primer using System; using System.)ollections; namespace DoFactory.GangOfFour.Obser!er.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // )onfigure Obser!er pattern )oncreteSub ect s ' ne( )oncreteSub ect#$; s.Attac4#ne( )oncreteObser!er#sK.<.$$; s.Attac4#ne( )oncreteObser!er#sK.=.$$; s.Attac4#ne( )oncreteObser!er#sK.^.$$; // )4ange sub ect an" notify obser!ers s.Sub ectState ' .A0).; s.6otify#$; // ,ait for user )onsole.*ea"#$; // .Sub ect. abstract class Sub ect { pri!ate Array3ist obser!ers ' ne( Array3ist#$; public !oi" Attac4#Obser!er obser!er$ { obser!ers.A""#obser!er$; public !oi" Detac4#Obser!er obser!er$ { obser!ers.*emo!e#obser!er$; public !oi" 6otify#$ {

foreac4 #Obser!er o in obser!ers$ { o.Np"ate#$; // .)oncreteSub ect. class )oncreteSub ect 1 Sub ect { pri!ate string sub ectState; // /roperty public string Sub ectState { get{ return sub ectState; set{ sub ectState ' !alue; // .Obser!er. abstract class Obser!er { public abstract !oi" Np"ate#$; // .)oncreteObser!er. class )oncreteObser!er 1 Obser!er { pri!ate string name; pri!ate string obser!erState; pri!ate )oncreteSub ect sub ect; // )onstructor public )oncreteObser!er# )oncreteSub ect sub ectK string name$ { t4is.sub ect ' sub ect; t4is.name ' name; public o!erri"e !oi" Np"ate#$ { obser!erState ' sub ect.Sub ectState; )onsole.,rite3ine#.Obser!er {H-Us ne( state is {&-.K nameK obser!erState$; // /roperty public )oncreteSub ect Sub ect { get { return sub ect; set { sub ect ' !alue; 28la8 Obser!er <Us ne( state is A0) Obser!er =Us ne( state is A0)

Obser!er ^Us ne( state is A0)

Pri#er i+ st)arnog s)eta


92aj pri"er i& st2arno! s2eta prika&%je obra&ac 9bser2er % ko"e se re!istro2ani in2estitori se oba2e:ta2aj% s2aki p%t ka a akcije pro"ene s2oje 2re nosti.

// Obser!er pattern -- /rimer i8 st!arnog s!eta using System; using System.)ollections; namespace DoFactory.GangOfFour.Obser!er.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // )reate in!estors 2n!estor s ' ne( 2n!estor#.Sorros.$; 2n!estor b ' ne( 2n!estor#.0erks4ire.$; // )reate 20M stock an" attac4 in!estors 20M ibm ' ne( 20M#.20M.K &+H.HH$; ibm.Attac4#s$; ibm.Attac4#b$; // )4ange ibm./rice ibm./rice ibm./rice ibm./rice priceK (4ic4 notifies in!estors ' &+H.&H; ' &+&.HH; ' &+H.GH; ' &+H.XG;

// ,ait for user )onsole.*ea"#$; // .Sub ect. abstract class Stock { protecte" string symbol; protecte" "ouble price; pri!ate Array3ist in!estors ' ne( Array3ist#$; // )onstructor public Stock#string symbolK "ouble price$ { t4is.symbol ' symbol; t4is.price ' price;

public !oi" Attac4#2n!estor in!estor$ { in!estors.A""#in!estor$; public !oi" Detac4#2n!estor in!estor$ { in!estors.*emo!e#in!estor$; public !oi" 6otify#$ { foreac4 #2n!estor in!estor in in!estors$ { in!estor.Np"ate#t4is$; )onsole.,rite3ine#..$; // /roperties public "ouble /rice { get{ return price; set { price ' !alue; 6otify#$; public string Symbol { get{ return symbol; set{ symbol ' !alue; // .)oncreteSub ect. class 20M 1 Stock { // )onstructor public 20M#string symbolK "ouble price$ 1 base#symbolK price$ { // .Obser!er. interface 22n!estor { !oi" Np"ate#Stock stock$; // .)oncreteObser!er. class 2n!estor 1 22n!estor { pri!ate string name; pri!ate Stock stock;

// )onstructor public 2n!estor#string name$ { t4is.name ' name; public !oi" Np"ate#Stock stock$ { )onsole.,rite3ine#.6otifie" {H- of {&-Us . 7 .c4ange to {+1)-.K nameK stock.SymbolK stock./rice$; // /roperty public Stock Stock { get{ return stock; set{ stock ' !alue; 28la8 6otifie" Sorros of 20MUs c4ange to ]&+H.&H 6otifie" 0erks4ire of 20MUs c4ange to ]&+H.&H 6otifie" Sorros of 20MUs c4ange to ]&+&.HH 6otifie" 0erks4ire of 20MUs c4ange to ]&+&.HH 6otifie" Sorros of 20MUs c4ange to ]&+H.GH 6otifie" 0erks4ire of 20MUs c4ange to ]&+H.GH 6otifie" Sorros of 20MUs c4ange to ]&+H.XG 6otifie" 0erks4ire of 20MUs c4ange to ]&+H.XG

Stanje (State)
Definicija
Do&2olja2a a objekat pro"eni pona:anje ka a se nje!o2o interno stanje pro"eni.

U ! Dijagra# klasa

$le#enti
Klase iEili objekti koje %-est2%j% % o2o" obrasc% s%(

Context (Account) o efini:e interfejs koji je potreban klijent% o 2o i ra-%na o instanci klase Concrete5tate koja efini:e tren%tno stanje State (State) o efini:e interfejs &a enkaps%lacij% pona:anja koje je asocirano sa o reCeni" stanje" klase Conte8t. Concrete State (RedState, SilverState, +oldState) o s2aka po klasa i"ple"entira pona:anje koje je asocirano sa o !o2araj%=i" stanji"a klase Conte8t

Pri#er ko"a u je+iku C,


92aj str%kt%rni ko prika&%je %potreb% obrasca 5tate koji o&2olja2a objekt% a se pona:a r%!a-ije % &a2isnosti o s2o! interno! stanja. ;a&lika % pona:anj% je ele!irana objekt% koji pre sta2lja o !o2araj%=e stanje.

// State pattern -- Strukturni primer using System; namespace DoFactory.GangOfFour.State.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // Setup conte;t in a state )onte;t c ' ne( )onte;t#ne( )oncreteStateA#$$; // 2ssue reWuestsK (4ic4 toggles state c.*eWuest#$; c.*eWuest#$; c.*eWuest#$; c.*eWuest#$; // ,ait for user )onsole.*ea"#$; // .State. abstract class State { public abstract !oi" 9an"le#)onte;t conte;t$; // .)oncreteStateA. class )oncreteStateA 1 State { public o!erri"e !oi" 9an"le#)onte;t conte;t$ { conte;t.State ' ne( )oncreteState0#$; // .)oncreteState0. class )oncreteState0 1 State { public o!erri"e !oi" 9an"le#)onte;t conte;t$ { conte;t.State ' ne( )oncreteStateA#$; // .)onte;t. class )onte;t { pri!ate State state; // )onstructor public )onte;t#State state$ {

t4is.State ' state; // /roperty public State State { get{ return state; set { state ' !alue; )onsole.,rite3ine#.State1 . 7 state.Get5ype#$.6ame$; public !oi" *eWuest#$ { state.9an"le#t4is$; 28la8 State1 State1 State1 State1 State1 )oncreteStateA )oncreteState0 )oncreteStateA )oncreteState0 )oncreteStateA

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje upotrebu obrasca 0tate koji dozvoljava da se objekat klase *ccount !.aun$ ponaa drugaije u zavisnosti od koliine raspoloivi' sredstava. .azlika u ponaanju je delegirana kroz objekte .ed0tate, 0ilver0tate i "old0tate. Ova stanja opisuju raun koji je minusu, tek otvoreni raun i raun sa ?dobrom istorijom@ sukcesivno.

// State pattern -- /rimer i8 st!arnog s!eta using System; namespace DoFactory.GangOfFour.State.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // Open a ne( account Account account ' ne( Account#.Vim Vo4nson.$; // Apply financial transactions account.Deposit#GHH.H$; account.Deposit#AHH.H$; account.Deposit#GGH.H$; account./ay2nterest#$;

account.,it4"ra(#+HHH.HH$; account.,it4"ra(#&&HH.HH$; // ,ait for user )onsole.*ea"#$; // .State. abstract class State { protecte" Account account; protecte" "ouble balance; protecte" "ouble interest; protecte" "ouble lo(er3imit; protecte" "ouble upper3imit; // /roperties public Account Account { get{ return account; set{ account ' !alue; public "ouble 0alance { get{ return balance; set{ balance ' !alue; public abstract !oi" Deposit#"ouble amount$; public abstract !oi" ,it4"ra(#"ouble amount$; public abstract !oi" /ay2nterest#$; // .)oncreteState. // Account is o!er"ra(n class *e"State 1 State { "ouble ser!iceFee; // )onstructor public *e"State#State state$ { t4is.balance ' state.0alance; t4is.account ' state.Account; 2nitiali8e#$; pri!ate !oi" 2nitiali8e#$ { // S4oul" come from a "atasource interest ' H.H; lo(er3imit ' -&HH.H; upper3imit ' H.H; ser!iceFee ' &G.HH; public o!erri"e !oi" Deposit#"ouble amount$

{ balance 7' amount; State)4ange)4eck#$; public o!erri"e !oi" ,it4"ra(#"ouble amount$ { amount ' amount - ser!iceFee; )onsole.,rite3ine#.6o fun"s a!ailable for (it4"ra(al[.$; public o!erri"e !oi" /ay2nterest#$ { // 6o interest is pai" pri!ate !oi" State)4ange)4eck#$ { if #balance Z upper3imit$ { account.State ' ne( Sil!erState#t4is$; // .)oncreteState. // Sil!er is non-interest bearing state class Sil!erState 1 State { // O!erloa"e" constructors public Sil!erState#State state$ 1 t4is# state.0alanceK state.Account$ { public Sil!erState#"ouble balanceK Account account$ { t4is.balance ' balance; t4is.account ' account; 2nitiali8e#$; pri!ate !oi" 2nitiali8e#$ { // S4oul" come from a "atasource interest ' H.H; lo(er3imit ' H.H; upper3imit ' &HHH.H; public o!erri"e !oi" Deposit#"ouble amount$ { balance 7' amount; State)4ange)4eck#$; public o!erri"e !oi" ,it4"ra(#"ouble amount$ { balance -' amount; State)4ange)4eck#$;

public o!erri"e !oi" /ay2nterest#$ { balance 7' interest _ balance; State)4ange)4eck#$; pri!ate !oi" State)4ange)4eck#$ { if #balance T lo(er3imit$ { account.State ' ne( *e"State#t4is$; else if #balance Z upper3imit$ { account.State ' ne( Gol"State#t4is$; // .)oncreteState. // 2nterest bearing state class Gol"State 1 State { // O!erloa"e" constructors public Gol"State#State state$ 1 t4is#state.0alanceKstate.Account$ { public Gol"State#"ouble balanceK Account account$ { t4is.balance ' balance; t4is.account ' account; 2nitiali8e#$; pri!ate !oi" 2nitiali8e#$ { // S4oul" come from a "atabase interest ' H.HG; lo(er3imit ' &HHH.H; upper3imit ' &HHHHHHH.H; public o!erri"e !oi" Deposit#"ouble amount$ { balance 7' amount; State)4ange)4eck#$; public o!erri"e !oi" ,it4"ra(#"ouble amount$ { balance -' amount; State)4ange)4eck#$; public o!erri"e !oi" /ay2nterest#$ { balance 7' interest _ balance;

State)4ange)4eck#$; pri!ate !oi" State)4ange)4eck#$ { if #balance T H.H$ { account.State ' ne( *e"State#t4is$; else if #balance T lo(er3imit$ { account.State ' ne( Sil!erState#t4is$; // .)onte;t. class Account { pri!ate State state; pri!ate string o(ner; // )onstructor public Account#string o(ner$ { // 6e( accounts are USil!erU by "efault t4is.o(ner ' o(ner; state ' ne( Sil!erState#H.HK t4is$; // /roperties public "ouble 0alance { get{ return state.0alance; public State State { get{ return state; set{ state ' !alue; public !oi" Deposit#"ouble amount$ { state.Deposit#amount$; )onsole.,rite3ine#.Deposite" {H1)- --- .K amount$; )onsole.,rite3ine#. 0alance ' {H1)-.K t4is.0alance$; )onsole.,rite3ine#. Status ' {H->n. K t4is.State.Get5ype#$.6ame$; )onsole.,rite3ine#..$; public !oi" ,it4"ra(#"ouble amount$ { state.,it4"ra(#amount$; )onsole.,rite3ine#.,it4"re( {H1)- --- .K amount$; )onsole.,rite3ine#. 0alance ' {H1)-.K t4is.0alance$; )onsole.,rite3ine#. Status ' {H->n. K t4is.State.Get5ype#$.6ame$; public !oi" /ay2nterest#$

{ state./ay2nterest#$; )onsole.,rite3ine#.2nterest /ai" --- .$; )onsole.,rite3ine#. 0alance ' {H1)-.K t4is.0alance$; )onsole.,rite3ine#. Status ' {H->n. K t4is.State.Get5ype#$.6ame$; 28la8 Deposite" ]GHH.HH --0alance ' ]GHH.HH Status ' Sil!erState Deposite" ]AHH.HH --0alance ' ]MHH.HH Status ' Sil!erState Deposite" ]GGH.HH --0alance ' ]&KAGH.HH Status ' Gol"State 2nterest /ai" --0alance ' ]&KI&X.GH Status ' Gol"State ,it4"re( ]+KHHH.HH --0alance ' #]GM+.GH$ Status ' *e"State 6o fun"s a!ailable for (it4"ra(al[ ,it4"re( ]&K&HH.HH --0alance ' #]GM+.GH$ Status ' *e"State

Strate#ija (Strate#y)
Definicija
Defini:e fa"ilij% al!orita"aD enkaps%lira s2aki o nji.D i -ini i. "eC%sobno ost%pni". 5trate!ija o&2olja2a al!orit"% "oBe biti pro"enlji2 ne&a2isno o klijenata koji !a koriste.

U ! Dijagra# klasa

$le#enti
Klase iEili objekti koje %-est2%j% % o2o" obrasc% s%(

Strate)y (SortStrate)y) o eklari:e &aje ni-ki interfejs &a s2e po rBane al!orit"e. 9bjekti klase kontekst koriste o2aj interfejs a po&o2% al!orit"e efinisane Concrete5trate!y fa"ilijo" klasa. ConcreteStrate)y (,uic#Sort, ShellSort, Mer)eSort) o i"ple"entira al!orita" koriste=i interfejs klase 5trate!y Context (Sorted-i!t) o konfi!%ri:e se po"o=% Concrete5trate!y objekata o -%2a referenc% na objekat klase 5trate!y o "oBe a efini:e interfejs koji objekt% klase 5trate!y o&2olja2a prist%p po aci"a

Pri#er ko"a u je+iku C,


92aj str%kt%rni ko prika&%je %potreb% obrasca 5trate!y koji enkaps%lira f%nkcionalnosti % for"i objekta. 92o klijent% o"o!%=a2a a ina"i-ki "enja strate!ij% pri"ene al!orita"a.

// Strategy pattern -- Strukturni primer using System; namespace DoFactory.GangOfFour.Strategy.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { )onte;t conte;t; // 54ree conte;ts follo(ing "ifferent strategies conte;t ' ne( )onte;t#ne( )oncreteStrategyA#$$; conte;t.)onte;t2nterface#$; conte;t ' ne( )onte;t#ne( )oncreteStrategy0#$$; conte;t.)onte;t2nterface#$; conte;t ' ne( )onte;t#ne( )oncreteStrategy)#$$; conte;t.)onte;t2nterface#$; // ,ait for user )onsole.*ea"#$; // .Strategy. abstract class Strategy { public abstract !oi" Algorit4m2nterface#$; // .)oncreteStrategyA. class )oncreteStrategyA 1 Strategy { public o!erri"e !oi" Algorit4m2nterface#$ { )onsole.,rite3ine# .)alle" )oncreteStrategyA.Algorit4m2nterface#$.$; // .)oncreteStrategy0. class )oncreteStrategy0 1 Strategy { public o!erri"e !oi" Algorit4m2nterface#$ {

)onsole.,rite3ine# .)alle" )oncreteStrategy0.Algorit4m2nterface#$.$; // .)oncreteStrategy). class )oncreteStrategy) 1 Strategy { public o!erri"e !oi" Algorit4m2nterface#$ { )onsole.,rite3ine# .)alle" )oncreteStrategy).Algorit4m2nterface#$.$; // .)onte;t. class )onte;t { Strategy strategy; // )onstructor public )onte;t#Strategy strategy$ { t4is.strategy ' strategy; public !oi" )onte;t2nterface#$ { strategy.Algorit4m2nterface#$; 28la8 )alle" )oncreteStrategyA.Algorit4m2nterface#$ )alle" )oncreteStrategy0.Algorit4m2nterface#$ )alle" )oncreteStrategy).Algorit4m2nterface#$

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje upotrebu obrasca 0trateg7 koji enkapsulira razliite algoritme sortiranja u formi objekata. Ovo klijentu omoguava da dinamiki menja strategije sortiranja !ovde su podrani Duicksort, 0'ellsort i -ergesort$.

// Strategy pattern -- /rimer i8 st!arnog s!eta using System; using System.)ollections; namespace DoFactory.GangOfFour.Strategy.*eal,orl" { // MainApp test aplikaci a class MainApp

{ static !oi" Main#$ { // 5(o conte;ts follo(ing "ifferent strategies Sorte"3ist stu"ent*ecor"s ' ne( Sorte"3ist#$; stu"ent*ecor"s.A""#.Samual.$; stu"ent*ecor"s.A""#.Vimmy.$; stu"ent*ecor"s.A""#.San"ra.$; stu"ent*ecor"s.A""#.@i!ek.$; stu"ent*ecor"s.A""#.Anna.$; stu"ent*ecor"s.SetSortStrategy#ne( cuickSort#$$; stu"ent*ecor"s.Sort#$; stu"ent*ecor"s.SetSortStrategy#ne( S4ellSort#$$; stu"ent*ecor"s.Sort#$; stu"ent*ecor"s.SetSortStrategy#ne( MergeSort#$$; stu"ent*ecor"s.Sort#$; // ,ait for user )onsole.*ea"#$; // .Strategy. abstract class SortStrategy { public abstract !oi" Sort#Array3ist list$; // .)oncreteStrategy. class cuickSort 1 SortStrategy { public o!erri"e !oi" Sort#Array3ist list$ { list.Sort#$; // Default is cuicksort )onsole.,rite3ine#.cuickSorte" list .$; // .)oncreteStrategy. class S4ellSort 1 SortStrategy { public o!erri"e !oi" Sort#Array3ist list$ { //list.S4ellSort#$; not-implemente" )onsole.,rite3ine#.S4ellSorte" list .$; // .)oncreteStrategy. class MergeSort 1 SortStrategy { public o!erri"e !oi" Sort#Array3ist list$ { //list.MergeSort#$; not-implemente" )onsole.,rite3ine#.MergeSorte" list .$;

// .)onte;t. class Sorte"3ist { pri!ate Array3ist list ' ne( Array3ist#$; pri!ate SortStrategy sortstrategy; public !oi" SetSortStrategy#SortStrategy sortstrategy$ { t4is.sortstrategy ' sortstrategy; public !oi" A""#string name$ { list.A""#name$; public !oi" Sort#$ { sortstrategy.Sort#list$; // Display results foreac4 #string name in list$ { )onsole.,rite3ine#. . 7 name$; )onsole.,rite3ine#$; 28la8 cuickSorte" list Anna Vimmy Samual San"ra @i!ek S4ellSorte" list Anna Vimmy Samual San"ra @i!ek MergeSorte" list Anna Vimmy Samual San"ra @i!ek

/ablonski
Definicija

etod (0e plate !ethod)

Defini:e osno2% al!orit"a % nekoj operaciji tako :to poje ine korake ra& 2aja % po klase. 92aj obra&ac o&2olja2a po klasa"a a pre efini:% o reCene korake % al!orit"% i to be& "enjanja str%kt%re al!orit"a.

U ! Dijagra# klasa

$le#enti
Klase iEili objekti koje %-est2%j% % o2o" obrasc% s%(

Ab!tractCla!! (Data'bject) o efini:e apstraktne pri"iti2ne operacije koje konkretne po klase koriste &a i"ple"entacij% al!orita"a o i"ple"entira :ablonski "eto efini:%=i skelet al!orit"a. ?ablonski "eto =e po&i2ati kako pri"iti2ne operacije tako i operacije efinisane % apstraktni" klasa"a r%!i. fa"ilija objekata. ConcreteCla!! (Cu!to"erData'bject) o i"ple"entira pri"iti2ne operacije i 2o i ra-%na o specifi-ni" koraci"a % al!orit"% koji %nose po klase.

Pri#er ko"a u je+iku C,


92aj str%kt%rni ko prika&%je obra&ac Template method koji obe&beC%je skelet po&i2a "eto a koje &aje no -ine al!orita". Ne an ili 2i:e koraka "o!% biti ra&li-iti % s2akoj o po klasa. Po klase =e i"ple"entirati te korake be& %ticaja na sek2enc% po&i2a koraka.

// 5emplate Met4o" pattern -- Strukturni primer using System; namespace DoFactory.GangOfFour.5emplate.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { Abstract)lass c; c ' ne( )oncrete)lassA#$; c.5emplateMet4o"#$; c ' ne( )oncrete)lass0#$; c.5emplateMet4o"#$; // ,ait for user )onsole.*ea"#$; // .Abstract)lass. abstract class Abstract)lass { public abstract !oi" /rimiti!eOperation&#$; public abstract !oi" /rimiti!eOperation+#$; // 54e .5emplate met4o". public !oi" 5emplateMet4o"#$ { /rimiti!eOperation&#$; /rimiti!eOperation+#$; )onsole.,rite3ine#..$; // .)oncrete)lass. class )oncrete)lassA 1 Abstract)lass { public o!erri"e !oi" /rimiti!eOperation&#$ { )onsole.,rite3ine#.)oncrete)lassA./rimiti!eOperation&#$.$; public o!erri"e !oi" /rimiti!eOperation+#$ { )onsole.,rite3ine#.)oncrete)lassA./rimiti!eOperation+#$.$; class )oncrete)lass0 1 Abstract)lass { public o!erri"e !oi" /rimiti!eOperation&#$ { )onsole.,rite3ine#.)oncrete)lass0./rimiti!eOperation&#$.$;

public o!erri"e !oi" /rimiti!eOperation+#$ { )onsole.,rite3ine#.)oncrete)lass0./rimiti!eOperation+#$.$; 28la8 )oncrete)lassA./rimiti!eOperation&#$ )oncrete)lassA./rimiti!eOperation+#$ )oncrete)lass0./rimiti!eOperation&#$ )oncrete)lass0./rimiti!eOperation+#$

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta pokazuje kako ablonski metod .un!$ obezbeuje sekvencu poziva razliiti' metoda. 8mplementacije ovi' metoda su u klasi (ustomer&ataObject. Ova podklasa implementira metode (onnect, 0elect, Process i &isconnect.

// 5emplate Met4o" pattern -- /rimer i8 st!arnog s!eta using System; using System.Data; using System.Data.OleDb; namespace DoFactory.GangOfFour.5emplate.*eal,orl" { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { DataAccessOb ect "ao; "ao ' ne( )ategories#$; "ao.*un#$; "ao ' ne( /ro"ucts#$; "ao.*un#$; // ,ait for user )onsole.*ea"#$; // .Abstract)lass. abstract class DataAccessOb ect { protecte" string connectionString; protecte" DataSet "ataSet;

public !irtual !oi" )onnect#$ { // Make sure m"b is on c1> connectionString ' .pro!i"er'Microsoft.V:5.O3:D0.I.H; . 7 ."ata source'c1>>n(in".m"b.; public abstract !oi" Select#$; public abstract !oi" /rocess#$; public !irtual !oi" Disconnect#$ { connectionString ' ..; // 54e .5emplate Met4o". public !oi" *un#$ { )onnect#$; Select#$; /rocess#$; Disconnect#$; // .)oncrete)lass. class )ategories 1 DataAccessOb ect { public o!erri"e !oi" Select#$ { string sWl ' .select )ategory6ame from )ategories.; OleDbDataA"apter "ataA"apter ' ne( OleDbDataA"apter# sWlK connectionString$; "ataSet ' ne( DataSet#$; "ataA"apter.Fill#"ataSetK .)ategories.$; public o!erri"e !oi" /rocess#$ { )onsole.,rite3ine#.)ategories ---- .$; Data5able "ata5able ' "ataSet.5ablesE.)ategories.F; foreac4 #Data*o( ro( in "ata5able.*o(s$ { )onsole.,rite3ine#ro(E.)ategory6ame.F$; )onsole.,rite3ine#$; class /ro"ucts 1 DataAccessOb ect { public o!erri"e !oi" Select#$ { string sWl ' .select /ro"uct6ame from /ro"ucts.; OleDbDataA"apter "ataA"apter ' ne( OleDbDataA"apter# sWlK connectionString$; "ataSet ' ne( DataSet#$;

"ataA"apter.Fill#"ataSetK ./ro"ucts.$; public o!erri"e !oi" /rocess#$ { )onsole.,rite3ine#./ro"ucts ---- .$; Data5able "ata5able ' "ataSet.5ablesE./ro"ucts.F; foreac4 #Data*o( ro( in "ata5able.*o(s$ { )onsole.,rite3ine#ro(E./ro"uct6ame.F$; )onsole.,rite3ine#$; 28la8 )ategories ---0e!erages )on"iments )onfections Dairy /ro"ucts Grains/)ereals Meat//oultry /ro"uce Seafoo" /ro"ucts ---)4ai )4ang Anisee" Syrup )4ef AntonUs )a un Seasoning )4ef AntonUs Gumbo Mi; Gran"maUs 0oysenberry Sprea" Nncle 0obUs Organic Drie" /ears 6ort4(oo"s )ranberry Sauce Mis4i ?obe 6iku

Posetilac (1isitor)
Definicija
Pre sta2lja operacij% koja "oBe a b% e pri"enjena na objekti"a % o !o2araj%=oj str%kt%ri. 9bra&ac Aisitor o&2olja2a korisnik% a efini:e no2% operacij% be& potrebe a pro"eni klase objekata sa koji"a operi:e.

U ! Dijagra# klasa

$le#enti
Klase iEili objekti koje %-est2%j% % o2o" obrasc% s%(

i!itor ( i!itor)

eklari:e operacij% Aisit &a s2ak% klas% i& Concrete#le"ent fa"ilije. <"e operacije i njen GpotpisH i entifik%j% klas% koja je poslala &a.te2 Aisit posetioc%. 92o o"o!%=a2a posetioc% a je no&na-no o re i klas% objekta koji pose=%je. >akon to!a posetilac "oBe a prist%pa ele"enti"a irektno kro& ost%pni interfejs. Concrete i!itor (Inco"e i!itor, acation i!itor) o i"ple"entira s2ak% operacij% koj% eklari:e klasa Aisitor. 52aka operacija i"ple"entira je an fra!"ent al!orit"a koji je efinisan o !o2araj%=o" klaso" ili objekto". Klase i& fa"ilije ConcreteAisitor obe&beC%j% kontekst &a al!orita" i -%2aj%=i nje!o2o lokalno stanje. 92ak2o stanje naj-e:=e sl%Bi a ak%"%lira re&%ltat toko" obilaska str%kt%re. %le"ent (%le"ent) o efini:e operacij% Accept koja pre%&i"a objekat Aisitor kao ar!%"ent. Concrete%le"ent (%"ployee) o i"ple"entira operacij% Accept koja pri.2ata objekat Aisitor kao ar!%"ent 'bjectStructure (%"ployee!) o "oBe prola&iti kro& str%kt%r% ele"enata o "oBe a obe&beC%je interfejs 2isoko! ni2oa koji o&2olja2a Aisitor objekti"a a pose=%j% ele"ente o "oBe a b% e ili obra&ac Co"posite ili kolekcija kao :to je npr. lista ili sk%p
o

Pri#er ko"a u je+iku C,


92aj str%kt%rni ko prika&%je obra&ac Aisitor % ko"e je an objekat obila&i 9bject5tr%ct%re i 2r:i ist% operacij% na s2aki" -2oro".

// @isitor pattern -- Strukturni primer using System; using System.)ollections; namespace DoFactory.GangOfFour.@isitor.Structural { // MainApp test aplikaci a class MainApp { static !oi" Main#$ { // Setup structure Ob ectStructure o ' ne( Ob ectStructure#$; o.Attac4#ne( )oncrete:lementA#$$; o.Attac4#ne( )oncrete:lement0#$$; // )reate !isitor ob ects )oncrete@isitor& !& ' ne( )oncrete@isitor&#$; )oncrete@isitor+ !+ ' ne( )oncrete@isitor+#$;

// Structure accepting !isitors o.Accept#!&$; o.Accept#!+$; // ,ait for user )onsole.*ea"#$; // .@isitor. abstract class @isitor { public abstract !oi" @isit)oncrete:lementA# )oncrete:lementA concrete:lementA$; public abstract !oi" @isit)oncrete:lement0# )oncrete:lement0 concrete:lement0$; // .)oncrete@isitor&. class )oncrete@isitor& 1 @isitor { public o!erri"e !oi" @isit)oncrete:lementA# )oncrete:lementA concrete:lementA$ { )onsole.,rite3ine#.{H- !isite" by {&-.K concrete:lementA.Get5ype#$.6ameK t4is.Get5ype#$.6ame$; public o!erri"e !oi" @isit)oncrete:lement0# )oncrete:lement0 concrete:lement0$ { )onsole.,rite3ine#.{H- !isite" by {&-.K concrete:lement0.Get5ype#$.6ameK t4is.Get5ype#$.6ame$; // .)oncrete@isitor+. class )oncrete@isitor+ 1 @isitor { public o!erri"e !oi" @isit)oncrete:lementA# )oncrete:lementA concrete:lementA$ { )onsole.,rite3ine#.{H- !isite" by {&-.K concrete:lementA.Get5ype#$.6ameK t4is.Get5ype#$.6ame$; public o!erri"e !oi" @isit)oncrete:lement0# )oncrete:lement0 concrete:lement0$ { )onsole.,rite3ine#.{H- !isite" by {&-.K concrete:lement0.Get5ype#$.6ameK t4is.Get5ype#$.6ame$; // .:lement. abstract class :lement { public abstract !oi" Accept#@isitor !isitor$; -

// .)oncrete:lementA. class )oncrete:lementA 1 :lement { public o!erri"e !oi" Accept#@isitor !isitor$ { !isitor.@isit)oncrete:lementA#t4is$; public !oi" OperationA#$ { // .)oncrete:lement0. class )oncrete:lement0 1 :lement { public o!erri"e !oi" Accept#@isitor !isitor$ { !isitor.@isit)oncrete:lement0#t4is$; public !oi" Operation0#$ { // .Ob ectStructure. class Ob ectStructure { pri!ate Array3ist elements ' ne( Array3ist#$; public !oi" Attac4#:lement element$ { elements.A""#element$; public !oi" Detac4#:lement element$ { elements.*emo!e#element$; public !oi" Accept#@isitor !isitor$ { foreac4 #:lement e in elements$ { e.Accept#!isitor$; 28la8 )oncrete:lementA )oncrete:lement0 )oncrete:lementA )oncrete:lement0 !isite" !isite" !isite" !isite" by by by by )oncrete@isitor& )oncrete@isitor& )oncrete@isitor+ )oncrete@isitor+

Pri#er i+ st)arnog s)eta


Ovaj primer iz stvarnog sveta prikazuje upotrebu obrasca 3isitor u kome dva objekta prolaze kroz listu zaposleni' i vre istu operaciju na d svim instancama klase 1mplo7ee. Ova dva posetioca definiu razliite operacije : jedna postavlja broj slobodni' dana a druga visinu plate.

// @isitor pattern -- /rimer i8 st!arnog s!eta using System; using System.)ollections; namespace DoFactory.GangOfFour.@isitor.*eal,orl" { // MainApp startup application class MainApp { static !oi" Main#$ { // Setup employee collection :mployees e ' ne( :mployees#$; e.Attac4#ne( )lerk#$$; e.Attac4#ne( Director#$$; e.Attac4#ne( /resi"ent#$$; // :mployees are U!isite"U e.Accept#ne( 2ncome@isitor#$$; e.Accept#ne( @acation@isitor#$$; // ,ait for user )onsole.*ea"#$; // .@isitor. interface 2@isitor { !oi" @isit#:lement element$; // .)oncrete@isitor&. class 2ncome@isitor 1 2@isitor { public !oi" @isit#:lement element$ { :mployee employee ' element as :mployee; // /ro!i"e &Hd pay raise employee.2ncome _' &.&H; )onsole.,rite3ine#.{H- {&-Us ne( income1 {+1)-.K employee.Get5ype#$.6ameK employee.6ameK employee.2ncome$; // .)oncrete@isitor+.

class @acation@isitor 1 2@isitor { public !oi" @isit#:lement element$ { :mployee employee ' element as :mployee; // /ro!i"e A e;tra !acation "ays )onsole.,rite3ine#.{H- {&-Us ne( !acation "ays1 {+-.K employee.Get5ype#$.6ameK employee.6ameK employee.@acationDays$; class )lerk 1 :mployee { // )onstructor public )lerk#$ 1 base#.9ank.K +GHHH.HK &I$ { class Director 1 :mployee { // )onstructor public Director#$ 1 base#.:lly.K AGHHH.HK &Y$ { class /resi"ent 1 :mployee { // )onstructor public /resi"ent#$ 1 base#.Dick.K IGHHH.HK +&$ { // .:lement. abstract class :lement { public abstract !oi" Accept#2@isitor !isitor$; // .)oncrete:lement. class :mployee 1 :lement { string name; "ouble income; int !acationDays; // )onstructor public :mployee#string nameK "ouble incomeK int !acationDays$ { t4is.name ' name; t4is.income ' income; t4is.!acationDays ' !acationDays; // /roperties

public string 6ame { get{ return name; set{ name ' !alue; public "ouble 2ncome { get{ return income; set{ income ' !alue; public int @acationDays { get{ return !acationDays; set{ !acationDays ' !alue; public o!erri"e !oi" Accept#2@isitor !isitor$ { !isitor.@isit#t4is$; // .Ob ectStructure. class :mployees { pri!ate Array3ist employees ' ne( Array3ist#$; public !oi" Attac4#:mployee employee$ { employees.A""#employee$; public !oi" Detac4#:mployee employee$ { employees.*emo!e#employee$; public !oi" Accept#2@isitor !isitor$ { foreac4 #:mployee e in employees$ { e.Accept#!isitor$; )onsole.,rite3ine#$; 28la8 )lerk 9ankUs ne( income1 ]+XKGHH.HH Director :llyUs ne( income1 ]AMKGHH.HH /resi"ent DickUs ne( income1 ]I\KGHH.HH )lerk 9ankUs ne( !acation "ays1 &I Director :llyUs ne( !acation "ays1 &Y /resi"ent DickUs ne( !acation "ays1 +&

You might also like