You are on page 1of 70

Kryengul n’Paternat e Dizajnit

konceptet kryesore

përkthyer, përzgjedhur dhe përshtatur

nga Ridvan Bunjaku

Prishtinë, prill 2010


Kryengul n’Paternat e Dizajnit 2 / 70

Përmbajtja

1. HYRJE NË PATERNAT E DIZAJNIT - MIRËSEVINI NË PATERNAT E DIZAJNIT ...... 3 11. PATERNI PROXY (PËRFAQËSUESI) - KONTROLLIMI I QASJES NË OBJEKT ..... 38

2. PATERNI VËZHGUESI - MBAJTJA NË DIJENI E OBJEKTEVE TUAJA .................... 7 12. PATERNAT E PËRBËRA - PATERNAT E PATERNAVE ..................................... 40

3. PATERNI DEKORATORI (ZBUKURUESI) - DEKORIMI I OBJEKTEVE .................. 11 13. JETESA MË E MIRË ME PATERNA - PATERNAT NË BOTËN REALE ................. 45

4. PATERNI FABRIKA - GATIMI ME MIRËSI TË OOAD-SË ................................... 14 14. SHTOJCË: PATERNAT E MBETURA JASHTË .................................................. 47

5. PATERNI SINGLETONI (HASRETI) - OBJEKTET "NJË I LLOJIT TË VET" .............. 19 URA (BRIDGE)....................................................................................................... 47
NDËRTUESI (BUILDER) ............................................................................................ 50
6. PATERNI KOMANDA - ENKAPSULIMI I THIRRJES (INVOKIMIT) ...................... 21
ZINGJIRI I PËRGJEGJËSISË (CHAIN OF RESPONSIBILITY) .................................................... 53
7. PATERNAT ADAPTERI DHE FASADA - TË QENURIT ADAPTIV ......................... 24 PESHË-MIZA (FLYWEIGHT) ....................................................................................... 56
8. PATERNI METODA SHABLLON - ENKAPSULIMI I ALGORITMEVE ................... 29 INTERPRETUESI (INTERPRETER) ................................................................................. 58
NDËRMJETËSUESI (MEDIATOR) ................................................................................ 61
9. PATERNAT ITERATORI DHE KOMPOZITI - KOLEKSIONET E MENAXHUARA PËRKUJTUESI (MEMENTO)....................................................................................... 64
MIRË ................................................................................................................ 31 PROTOTIPI (PROTOTYPE) ......................................................................................... 66
10. PATERNI GJENDJA - GJENDJA E GJËRAVE .................................................... 35 VIZITORI (VISITOR)................................................................................................. 69
Kryengul n’Paternat e Dizajnit 3 / 70

1. Hyrje në Paternat e Dizajnit - Mirësevini në Paternat e Dizajnit

Paternat OO
Bazat OO

Strategjia (Strategy)
Abstraksioni
E definon një familje të algoritmeve, e enkapsulon secilin
Enkapsulimi
nga ta, dhe i bën ata të këmbyeshëm me njëri-tjetrin.
Polimorfizmi Strategjia e lejon algoritmin me ndryshu pavarësisht nga
klientët që e përdorin atë.
Trashëgimia

Principet OO

Enkapsuloje atë që ndryshon.

Favorizoje kompozimin ndaj trashëgimisë.

Programo ndaj interfejsave, jo ndaj implementimeve.


Kryengul n’Paternat e Dizajnit 4 / 70

Sjellja e enkapsuluar e fluturimit


Shembull:
<<interfejs>>
Klienti SjelljeEFluturimit
Rosë
fluturo()
SjelljeEFluturimit sjelljaEFluturimit
SjelljeEKakarisjes sjelljaEKakarisjes
noto()
shfaqu()
performojeKakarisjen()
performojeFluturimin()
caktojeSjelljenEFluturimit()
caktojeSjelljenEKakarisjes()
FluturimMeKrahë FluturimSKaShansa
// metoda TJERA të patës...
fluturo() fluturo()
{ {
// e implementon // Mos bën kurrgjë
// fluturimin e rosës // nuk mundet me fluturu!
} }

RosëEEgër RosëKryekuqe RosëEGomës RosëKarrem


shfaqu() shfaqu() shfaqu() shfaqu()
{ { { { Sjellja e enkapsuluar e kakarisjes
// duket si //duket si rosë // duket si rosë // duket si rosë
// rosë e egër // me krye të kuq // e gomës // për karrem <<interfejs>>
} } } } SjelljeEKakarisjes
kakaris()

Kakarisje Kuik KakarisjeMemece


kakaris() kakaris() kakaris()
{ { {
// e implementon // Kuik i rosës së gomës // Mos bën kurgjë
// kakarisjen e rosës } // nuk mundet me kakarisë
} }
Kryengul n’Paternat e Dizajnit 5 / 70

Shembull tjetër:

Karakter
<<interfejs>>
SjelljeEArmës arma SjelljeEArmës
lufto() Një karakter E KA NJË përdoreArmën()
caktoArmën(SjelljeEArmës a) (HAS-A) SjelljeTëArmës
{ this.arma = a; }

Mbret Mbretëreshë Kalorës Div


lufto() { ... } lufto() { ... } lufto() { ... } lufto() { ... } SjelljeThikë SjelljeHarkDheShigjetë
përdoreArmën() përdoreArmën()
{ {
Shkurtabiq Troll // e implementon // e implementon
lufto() { ... } lufto() { ... } // premjen me thikë // gjuajtjen e shigjetës
} }

SjelljeShpatë SjelljeSopatë
përdoreArmën() përdoreArmën()
{ {
// e implementon // e implementon
// vërtitjen e shpatës // copëtimin me sopatë
} }
Kryengul n’Paternat e Dizajnit 6 / 70

Pikat kryesore

Njohja e bazave OO nuk të bën dizajner të mirë OO. Paternat nuk shpiken, ato gjenden, zbulohen.

Dizajnet e mira OO janë të ripërdorshme, të zgjerueshme dhe të Shumica e paternave dhe principeve iu adresohen çështjeve të
mirëmbajtshme. ndryshimit në softuer.

Paternat ju tregojnë se qysh me ndërtu sisteme me cilësi të mira Shumica e paternave e lejojnë një pjesë të sistemit me ndryshu
të dizajnit OO. në mënyrë të pavarur nga të gjitha pjesët tjera.

Paternat janë përjetim, eksperiencë e dëshmuar e orientimit kah Shpesh provojmë me marrë atë që ndryshon në një sistem dhe
objektet. me enkapsulu.

Paternat nuk ta japin kodin, ato të japin zgjidhje të përgjithshme Paternat e ofrojnë një gjuhë të përbashkët që mundet me
për problemet e dizajnit. Ti i aplikon ato për aplikacionin specifik. maksimizu vlerën e komunikimit tuaj me zhvilluesit tjerë.
Kryengul n’Paternat e Dizajnit 7 / 70

2. Paterni Vëzhguesi - Mbajtja në dijeni e objekteve tuaja

Subjektet, apo siç i njohim edhe ndryshe, të Vëzhgueshmit


Principet OO
(Observables), i freskojnë Vëzhguesit duke e përdorë një interfejs
të përbashkët.
Syno për dizajne të çiftuara ulët (shlirë) ndërmjet objekteve që
Vëzhguesit janë të çiftuar dobët ashtu që i Vëzhgueshmi nuk din
ndërveprojnë.
asgjë për ta, pos që ata e implementojnë interfejsin Vëzhgues
(Observer).

Paternat OO Kur e përdor paternin, mundesh m'i shty (push) apo m'i tërheqë
(pull) shënimet nga i Vëzhgueshmi (tërheqja konsiderohet më
Vëzhguesi (Observer) "korrekte").

E definon një varësi një-me-shumë ndërmjet objekteve Mos u var nga radhitja specifike e njoftimit për Vëzhguesit tuaj.
ashtu që kur një objekt e ndryshon gjendjen, të gjithë
Java i ka disa implementime të Paternit Vëzhgues, duke e përfshi
vartësit e tij njoftohen dhe freskohen (update'ohen)
edhe Observable të java.util për qëllime të përgjithshme.
automatikisht.
Ruaju nga çështjet me implementimin java.util.Observable.
Pikat kryesore Mos u frikëso me kriju implementimin tënd Observable nëse
nevojitet.
Paterni Vëzhguesi e definon një relacion një-me-shumë ndërmjet
Swing e përdor gjerësisht Paternin Vëzhgues, si edhe shumë
objekteve.
korniza GUI.

Po ashtu do ta gjesh paternin edhe në shumë vende tjera, duke e


përfshi JavaBeans dhe RMI.
Kryengul n’Paternat e Dizajnit 8 / 70

Diagrami i klasave:

<<interfejs>> vëzhguesit <<interfejs>>


Subjekt Vëzhgues
regjistrojeVëzhguesin() fresko()
hiqeVëzhguesin()
njoftojiVëzhguesit()

SubjektKonkret VëzhguesKonkret
regjistrojeVëzhguesin() { … } fresko() { … }
hiqeVëzhguesin() { … } subjekti
njoftojiVëzhguesit() { … } // metoda tjera specifike për
Vëzhguesin
merreGjendjen()
caktojeGjendjen()
Kryengul n’Paternat e Dizajnit 9 / 70

Shembull:

<<interfejs>> vëzhguesit <<interfejs>> <<interfejs>>


Subjekt Vëzhgues ElementEkran
regjistrojeVëzhguesin() fresko() shfaq()
hiqeVëzhguesin()
njoftojiVëzhguesit()

ShënimeTëMotit EkranIKushteveAktuale
kti
regjistrojeVëzhguesin() { … } subje fresko() { … }
hiqeVëzhguesin() { … } shfaq() { // shfaqi matjet EkranIPalësSëTretë
njoftojiVëzhguesit() { … } aktuale } fresko() { … }
shfaq() { // shfaq diçka tjetër
merreTemperaturën() duke u bazu në matjet }
merreLagështinë()
merreShtypjen()
matjetUNdryshuan() EkranIStatistikave
fresko() { … }
shfaq() { // shfaqe
mesataren, minimumin dhe
maksimumin e matjeve }

EkranIParashikimeve
fresko() { … }
shfaq() { // shfaqe
parashikimin }
Kryengul n’Paternat e Dizajnit 10 / 70

Versioni me Observer të Java:

<<interfejs>> vëzhguesit <<interfejs>>


Observable Observer
addObserver() update()
deleteObserver()
notifyObservers()
setChanged()

EkranIKushteveAktuale EkranIStatistikave EkranIParashikimeve


kti
ShënimeTëMotit
subje fresko() { … } fresko() { … } fresko() { … }
merreTemperaturën() shfaq() { // shfaqi matjet shfaq() { // shfaqe shfaq() { // shfaqe
merreLagështinë() aktuale } mesataren, minimumin dhe parashikimin }
merreShtypjen() maksimumin e matjeve }
matjetUNdryshuan()
Kryengul n’Paternat e Dizajnit 11 / 70

3. Paterni Dekoratori (Zbukuruesi) - Dekorimi i objekteve

Paterni Dekoratori ofron alternativë ndaj nënklasimit për


Principet OO
zgjerimin e sjelljes.
Klasat duhet me qenë të hapura për zgjerim por të mbyllura për
ndryshim. Paterni Dekoratori e involvon një grup të klasave dekoruese që
përdoren për m’i mbështjellë komponentat konkrete.

Klasat dekoruese e pasqyrojnë tipin e komponentave që i


Paternat OO
dekorojnë. (Në fakt, ato janë të tipit të njëjtë si komponentat që i
Dekoratori (Decorator) dekorojnë, ose përmes trashëgimisë, ose përmes implementimit
të interfejsit).
Ngjiti përgjegjësi shtesë një objekti në mënyrë dinamike.
Dekoratorët ofrojnë alternativë fleksibile ndaj nënklasimit Dekoratorët e ndryshojnë sjelljen e komponentave të veta duke
për zgjerimin e funksionalitetit. shtu funksionalitet të ri para dhe/ose pas (apo edhe në vend të)
thirrjeve të metodave të komponentave.
Pikat kryesore Një komponentë mundesh me mbështjellë me çfarëdo numri të
dekoratorëve.
Trashëgimia është një formë e zgjerimit, por jo Dekoratorët zakonisht janë transparentë ndaj klientit të
domosdoshmërisht mënyra më e mirë për me arritë fleksibilitet komponentës; domethënë, pos nëse klienti mbështetet në tipin
në dizajnet tona. konkret të komponentës.
Në dizajnet tona duhemi me leju që sjellja m’u zgjeru pa pasë Dekoratorët munden me rezultu në shumë objekte të vogla në
nevojë me ndryshu kodin ekzistues. dizajnin tonë, dhe mbipërdorimi mundet me qenë kompleks.
Kompozimi dhe delegimi shpesh munden m’u përdorë për me
shtu sjellje gjatë kohës së ekzekutimit (runtime).
Kryengul n’Paternat e Dizajnit 12 / 70

Diagrami i klasave:

Komponentë
metodaA()
metodaB()
// metoda tjera

KomponentëKonkrete Dekorator
metodaA() metodaA()
metodaB() metodaB()
// metoda tjera // metoda tjera

DekoratorKonkretA DekoratorKonkretB
Komponentë objektiIMbështjellur Komponentë objektiIMbështjellur
Objekt gjendjaERe
metodaA()
metodaB() metodaA()
sjelljeERe() metodaB()
// metoda tjera // metoda tjera
Kryengul n’Paternat e Dizajnit 13 / 70

Shembull:

Pije
përshkrimi pija
merrePërshkrimin()
kostoja()
// metoda tjera të dobishme

KafeEShpisë KafeEPjekur ShtesëDekorator


kostoja() kostoja() merrePërshkrimin()

Espreso PaKafeinë
kostoja() kostoja()

Qumësht Mocha Sojë Shllag


Pije pija Pije pija Pije pija Pije pija
kostoja() kostoja() kostoja() kostoja()
merrePërshkrimin() merrePërshkrimin() merrePërshkrimin() merrePërshkrimin()
Kryengul n’Paternat e Dizajnit 14 / 70

4. Paterni Fabrika - Gatimi me mirësi të OOAD-së

Pikat kryesore
Principet OO

Të gjitha fabrikat e enkapsulojnë krijimin e objektit.


Varu nga abstraksionet. Mos u var nga klasat konkrete.
Fabrika e Thjeshtë, edhe pse nuk është patern i dizajnit bona fide,
është mënyrë e thjeshtë m’i shçiftu klientët tuaj nga klasat
konkrete.

Paternat OO Metoda Fabrikë mbështetet në trashëgimi: krijimi i objekteve i


delegohet nënklasave të cilat e implementojnë metodën fabrikë
Fabrika Abstrakte (Abstract Factory) për me kriju objekte.

Ofroje një interfejs për me kriju familje të objekteve të Fabrika Abstrakte mbështetet në kompozimin e objekteve: krijimi
ndërlidhura apo të varura pa i specifiku klasat e tyre i objekteve është i implementuar në metodat e ekspozuara në
konkrete. interfejsin e fabrikës.

Të gjitha paternat fabrika e promovojnë çiftimin e shlirë duke e


reduktu varësinë e aplikacionit tuaj nga klasat konkrete.
Metoda Fabrikë (Factory Method)
Principi i Inversionit të Varësisë (i kthimit mbrapsht, përmbysjes)
Definoje një interfejs për me kriju një objekt, por lejoji
na udhëzon me iu shmangë varësive nga tipet konkrete dhe me
nënklasat me vendosë se cilën klasë me instancu. Metoda
synu kah abstraksionet.
Fabrikë ia lejon një klase me shty instancimin te nënklasat.
Fabrikat janë teknikë e fuqishme për me kodu ndaj
abstraksioneve, e jo ndaj klasave konkrete.
Kryengul n’Paternat e Dizajnit 15 / 70

Fabrika e thjeshtë - shembull:

ShitoreEPicave FabrikëEThjeshtëEPicave Picë


porositPicë() krijoPicë() përgatite()
pjeke()
preje()
paketoje()

PicëMeDjath PicëMeFeferona

PicëVegjetariane PicëMeGuaca

Metoda Fabrikë - diagrami i klasave:

Produkt Krijues
metodaFabrikë()
njëOperacion()

ProduktKonkret KrijuesKonkret
metodaFabrikë()
Kryengul n’Paternat e Dizajnit 16 / 70

Metoda Fabrikë – shembull (këtu metodë fabrikë është krijojePicën()):

Klasat Krijuese ShitoreEPicave


krijojePicën()
porositePicën()

ShitoreEPicaveNY ShitoreEPicaveÇikago
krijojePicën() krijojePicën()

Klasat Produkte Picë


Principi i Inversionit të Varësisë
përgatite()
pjeke()
preje()
paketoje()

PicëMeDjathStilNY PicëMeDjathStilÇikago

PicëMeFeferonaStilNY PicëMeFeferonaStilÇikago

PicëMeGuacaStilNY PicëMeGuacaStilÇikago

PicëVegjetarianeStilNY PicëVegjetarianeStilÇikago
Kryengul n’Paternat e Dizajnit 17 / 70

Fabrika Abstrakte - diagrami i klasave:

Klient

<<interface>>
FabrikëAbstrakte
KrijojeProduktinA()
KrijojeProduktinB()

<<interface>>
ProduktAbstraktA

FabrikëKonkrete1 FabrikëKonkrete2

ProduktA2 ProduktA1

<<interface>>
ProduktAbstraktB

ProduktB2 ProduktB1
Picë
Kryengul n’Paternat e Dizajnit përgatite() 18 / 70
// metoda tjera
<<interface>>
FabrikëEPërbërësveTëPicës
<<interface>>
krijojeBrumin()
Brum
krijojeSosin()
krijojeDjathin()
Fabrika Abstrakte – shembull: krijojiPerimet()
krijojiFafaronat()
krijojiGuacat()
BrumMeKoreTëTrashë BrumMeKoreTëHollë

<<interface>>
FabrikëEPërbërësveTëPicësNY FabrikëEPërbërësveTëPicësÇikago Sos
krijojeBrumin() krijojeBrumin()
krijojeSosin() krijojeSosin()
krijojeDjathin() krijojeDjathin()
krijojiPerimet() krijojiPerimet()
krijojiFafaronat() krijojiFafaronat()
SosMeDomateTëKuqe SosMarinara
krijojiGuacat() krijojiGuacat()

<<interface>>
Djath

DjathMozzarella DjathReggiano

<<interface>>
Guaca

GuacaTëNgrira GuacaTëFreskëta
Kryengul n’Paternat e Dizajnit 19 / 70

5. Paterni Singletoni (Hasreti) - Objektet "një i llojit të vet"

Ruajuni nga implementimi mbyllës i kontrolluar dyfish (double-


Paternat OO
checked locking implementation); ai nuk është i sigurtë në
thread-a në versionet para Java 2, versioni 5.
Singletoni (Singleton)
Kini kujdes nëse jeni duke përdorë shumë ngarkues të klasëve
Sigurohu që një klasë e ka vetëm një instancë dhe ofroje
(class loaders); kjo mundet me rrëzu implementimin e Singletonit
një pikë globale të qasjes për të.
dhe me rezultu në shumë instanca.

Nëse jeni duke përdorë JVM më të hershme se 1.2, do të ju duhet


Pikat kryesore me kriju një regjistër të Singletonave për me mundë mbledhësin
e bërllogut (garbage collector-in).
Paterni Singletoni siguron që keni të shumtën një instancë të një
klase në aplikacionin tuaj.

Paterni Singletoni po ashtu ofron pikë të qasjes globale për atë


instancë.

Implementimi Java i Paternit Singleton e përdor konstruktorin


privat, një metodë statike të kombinuar me një ndryshore statike.

Shqyrtoni kufizimet tuaja të performansës dhe të resurseve dhe


zgjedhni me kujdes një implementim të duhur të Singletonit për
aplikacionet me shumë thread-a (fije) (dhe ne duhet me
konsideru se të gjitha aplikacionet janë me shumë thread-a).
Kryengul n’Paternat e Dizajnit 20 / 70

Diagrami i klasës:

Singleton
static instancaUnike

// Shënime tjera të dobishme të Singletonit...

static merreInstancën()

// Metoda tjera të dobishme të Singletonit...


Kryengul n’Paternat e Dizajnit 21 / 70

6. Paterni Komanda - Enkapsulimi i Thirrjes (invokimit)

tij të mëparshme para momentit kur është thirrë herën e fundit


Paternat OO
metoda ekzekutohu().
Komanda (Command)
Komandat Makro janë zgjerim i thjeshtë i Komandës që lejojnë
E enkapsulon një kërkesë si objekt, duke ju leju kështu m’i m’u thirrë shumë komanda. Ngjashëm, Komandat Makro munden
parametrizu klientët me kërkesa të ndryshme, radhë lehtë me përkrahë zhbërjen, undo().
(queue) apo ditarë (log-a), dhe m’i përkrahë operacionet
Në praktikë, nuk është e pazakonshme që objektet "e mençura"
që mund të zhbëhen (undoable).
Komandë me implementu kërkesën vetë në vend se me ia delegu
pranuesit.

Pikat kryesore Komandat munden m’u përdorë edhe me implementu logging


Paterni Komanda e shçifton një objekt që e bën një kërkesë nga ai (shkruarje në ditar) dhe sisteme transaksionale.
i cili din se si me kry atë.
Objekti KomandëHiç (NoCommand) është shembull i një objekti
Një objekt Komandë është në qendër të këtij shçiftimi dhe e bosh (null object). Një objekt bosh është i dobishëm kur nuk keni
enkapsulon një pranues me një aksion (apo grup të aksioneve). objekt me kuptim për me kthy, dhe prapë doni me heqë
përgjegjësinë për me trajtu null-in nga klienti. Për shembull, në
Një thirrës e bën një kërkesë te një objekt Komandë duke e thirrë
digitronin tonë, nuk kemi pasë objekt me kuptim për me ia nda
metodën e tij ekzekutohu() (execute), e cila i thirr këto aksione te
secilit pozicion, prandaj e kemi ofru një objekt KomandëHiç që
pranuesi.
vepron si ushtrues i detyrës (zëvendësues) dhe nuk bën asgjë kur
Thirrësit munden m’u parametrizu me Komanda, bile edhe thirret metoda e tij ekzekutohu.
dinamikisht gjatë kohës së ekzekutimit. Do të gjeni përdorime të Objekteve Null në lidhje me shumë
Paterna të Dizajnit dhe nganjëherë bile do ta shihni Objektin Null
Komandat munden me përkrahë zhbërjen (undo) duke e të listuar si Patern i Dizajnit.
implementu një metodë zhbëj që e rikthen objektin në gjendjen e
Kryengul n’Paternat e Dizajnit 22 / 70

Diagrami i klasave:

<<interface>>
Klient Thirrës
Komandë
caktojeKomandën()
ekzekutohu()
zhbëje()

Pranues KomandëKonkrete
kryejeAksionin() ekzekutohu()
zhbëje()
public void ekzekutohu()
{ pranuesi.kryejeAksionin(); }
Kryengul n’Paternat e Dizajnit 23 / 70

Shembull:

NgarkuesIDigitronit Digitron <<interface>>


komandatOn Komandë
komandatOff ekzekutohu()

caktojeKomandën()
butoniOnËshtëTrusur()
butoniOffËshtëTrusur()

Dritë KomandëDritaOn
on() ekzekutohu()
off() public void ekzekutohu()
KomandëDritaOff
{ drita.on(); }
ekzekutohu()
public void ekzekutohu()
{ drita.off(); }
Kryengul n’Paternat e Dizajnit 24 / 70

7. Paternat Adapteri dhe Fasada - të qenurit adaptiv

Principet OO Kur ju nevojitet me thjeshtu një interfejs të madh apo një grup
Fol veç me shokët e tu kompleks të interfejsave, përdoreni një fasadë.
(Principi i Njohurisë më të Vogël apo Ligji i Demetrit)
Një adapter e ndryshon një interfejs në asi që e pret një klient.
Paternat OO
Një fasadë e shçifton një klient nga një nënsistem kompleks.
Adapteri (Adapter) Implementimi i një adapteri mundet me kërku pak punë apo
shumë punë varësisht nga madhësia dhe kompleksiteti i
E shndërron interfejsin e një klase në një interfejs tjetër të
interfejsit cak.
cilin e presin klientët. I lejon me punu bashkë klasat që
përndryshe s'kishin mujtë me punu për shkak të Implementimi i një fasade kërkon që ne me kompozu fasadën me
interfejsave të papërputhshëm. nënsistemin e saj dhe me përdorë delegimin për me kry punën e
fasadës.

Fasada (Facade) Janë dy forma të Paternit Adapter: adapterët objekt dhe


adapterët klasë. Adapterët klasë kërkojnë me pasë trashëgimi të
E ofron një interfejs të unifikuar për një grup të
shumëfishtë.
interfejsave në një nënsistem. Fasada e definon një
interfejs të nivelit më të lartë që e bën nënsistemin m’u Mundeni me implementu më shumë se një fasadë për një
përdorë më lehtë. nënsistem.

Një adapter e mbështjell një objekt për me ndryshu interfejsin e


Pikat kryesore tij, një dekorator e mbështjell një objekt për me shtu sjellje dhe
Kur ju nevojitet me përdorë një klasë ekzistuese dhe interfejsi i përgjegjësi tëreja, dhe një fasadë "e mbështjell" një grup të
saj nuk është ai që ju nevojitet, përdoreni një adapter. objekteve për me thjeshtu.
Kryengul n’Paternat e Dizajnit 25 / 70

Diagrami i klasave:

Adapteri Objektor

Klient <<interface>>
Cak
kërkesa()

Adapter IAdaptuar
kërkesa() kërkesaSpecifike()

Shembull

Klient <<interface>>
Rosë
kuako()

Adapter GjelDeti
kuako() kuoko()
Kryengul n’Paternat e Dizajnit 26 / 70

Adapteri Klasor

Klient Cak IAdaptuar


kërkesa() kërkesaSpecifike()

Adapter
kërkesa()
Kryengul n’Paternat e Dizajnit 27 / 70

Fasada - diagrami i klasave:

Klient Fasadë

Klasat e nënsistemit
Kryengul n’Paternat e Dizajnit 28 / 70

FasadëTeatërNëShtëpi
Shembull:
kqyreFilmin()
përfundojeFilmin()
dëgjojeCDnë()
ndaleCDnë()
dëgjojeRadion()
ndaleRadion()

Përforcues DvdPlayer
tuneri përforcuesi
dvdPlayeri on()
Tuner cdPlayeri off()
(Stacionues i radios) on() eject()
përforcuesi off() pause()
caktoCD() play()
on()
caktoDVD() play()
off()
caktoZëStereo() caktoAudioRrethues()
caktoAm()
caktoZëRrethues() caktoAudioDyKanalëshe()
caktoFm()
caktoTunerin() stop()
caktoFrekuencën()
caktoZërin()

Ekran CdPlayer
lart() përforcuesi Projektor
poshtë() on() dvdPlayeri
off()
on()
eject()
off()
pause()
tvMode()
play()
wideScreenMode()
play()
PjekësIPalagaçave stop()
on()
off()
pjeki()
DritaTëTeatrit
on()
off()
dobësoji()
Kryengul n’Paternat e Dizajnit 29 / 70

8. Paterni Metoda Shabllon - Enkapsulimi i algoritmeve

Klasa abstrakte e metodës shabllon mundet me definu metoda


Principet OO
konkrete, metoda abstrakte dhe metoda opsionale shtesë
Mos na thirr, ne të thërrasim (Principi i Hollivudit)
(hooks).

Metodat abstrakte implementohen nga nënklasat.


Paternat OO
Shtesat (hooks) janë metoda që nuk bëjnë asgjë ose e bëjnë
sjelljen e paracaktuar në klasën abstrakte, por munden m’u
Metoda Shabllon (Template Method)
mbishkru në nënklasë.
Definoje një skelet të një algoritmi në një operacion, duke
Për m’i parandalu nënklasat me ndryshu algoritmin në metodën
ua lënë disa hapa nënklasave.
shabllon, deklaroje metodën shabllon si finale.
Metoda Shabllon i lejon nënklasat m’i ridefinu hapat e
caktuar të një algoritmi pa e ndryshu strukturën e Principi i Hollivudit na udhëzon me vendosë vendim-marrjen në
algoritmit. modulet e nivelit të lartë që munden me vendosë se qysh dhe kur
m’i thirrë modulet e nivelit të ulët.

Do të shohësh shumë përdorime të Paternit Metoda Shabllon në


kodin e botës reale, por mos prit që të gjitha ato kanë me qenë të
Pikat kryesore dizajnuara "sipas librit" (si dhe për çfarëdo paterni tjetër).
Një "metodë shabllon" i definon hapat e një algoritmi, duke ua
lënë nënklasave implementimin e këtyre hapave. Të dy paternat Strategjia dhe Metoda Shabllon i enkapsulojnë
algoritmet, njëri përmes trashëgimisë, dhe tjetri sipas
Paterni Metoda Shabllon na e jep një teknikë të rëndësishme për kompozimit.
ripërdorimin e kodit.
Metoda Fabrikë është specializim i Metodës Shabllon.
Kryengul n’Paternat e Dizajnit 30 / 70

Diagrami i klasave:

KlasëAbstrakte

metodaShabllon() operacioniPrimitiv1();
operacioniPrimitiv1() operacioniPrimitiv2();
operacioniPrimitiv2()

KlasëKonkrete
operacioniPrimitiv1()
operacioniPrimitiv2()

Shembull:

PijeMeKafeinë

përgatiteRecetën() { vlojeUjin();
vlojeUjin() përgatite();
derdheNëGotë() derdheNëGotë();
përgatite() shtojiShtesat();
shtojiShtesat() }

Kafe Çaj
përgatite() përgatite()
shtojiShtesat() shtojiShtesat()
Kryengul n’Paternat e Dizajnit 31 / 70

9. Paternat Iteratori dhe Kompoziti - Koleksionet e menaxhuara mirë

Pikat kryesore
Principet OO Një Iterator lejon qasje në elementet e një agregati pa e ekspozu
Një klasë duhet me pasë vetëm një arsye për me ndryshu.
strukturën e tij të brendshme.
Një Iterator e merr punën e iterimit nëpër një agregat dhe e
enkapsulon atë punë në një objekt tjetër.
Paternat OO
Kur e përdorim një Iterator, ne e lirojmë agregatin nga
Iteratori (Iterator) përgjegjësia e përkrahjes së operacioneve për me kalu nëpër
shënimet e tij.
Ofroje një mënyrë për me iu qasë elementeve të një
Një Iterator ofron interfejs të përbashkët për kalimin nëpër
objekti agregat në mënyrë sekuenciale pa e ekspozu
elementet e një agregati, duke ju leju me përdorë polimorfizmin
reprezentimin e tij të brendshëm.
kur e shkruani kodin që i përdor elementet e agregatit.
Duhemi me synu me ia nda vetëm nga një përgjegjësi secilës
klasë.
Paterni Kompoziti e ofron një strukturë për m’i mbajtë edhe
Kompoziti (Composite)
objektet individuale edhe kompozitat.
Kompozoji objektet në struktura drunore për m’i Paterni Kompoziti i lejon klientët m’i trajtu në mënyrë të njëjtë
reprezentu hierarkitë e tipit e pjesshme-e plotë. Kompoziti (uniforme) kompozitat dhe objektet individuale.
i lejon klientët m’i trajtu në mënyrë të njëjtë (uniforme)
Komponentë është cilido objekt në një strukturë Kompozit.
objektet individuale dhe kompozimet e objekteve.
Komponentet munden me qenë kompozite tjera apo nyje gjethe.
Ka shumë balanse (tradeoffs) në implementimin e Kompozitit.
Duheni me balansu transparencën dhe sigurinë me nevojat tuaja.
Kryengul n’Paternat e Dizajnit 32 / 70

Iteratori - diagrami i klasave:

<<interface>> Klient <<interface>>


Agregat Iterator
krijojeIteratorin() kaTjetër()
tjetri()
fshije()

AgregatKonkret IteratorKonkret
krijojeIteratorin() kaTjetër()
tjetri()
fshije()

Shembull:

<<interface>> Kameriere <<interface>>


Meny printojeMenynë() Iterator
krijojeIteratorin() kaTjetër()
tjetri()
fshije()

MenyEPetullave MenyEDarkës IteratorMenyEPetullave IteratorMenyEDarkës


elementetEMenysë elementetEMenysë kaTjetër() kaTjetër()
tjetri() tjetri()
krijojeIteratorin() krijojeIteratorin()
fshije() fshije()
Kryengul n’Paternat e Dizajnit 33 / 70

Kompoziti - diagrami i klasave:

Klient
Komponentë

operacioni()
shtoje(Komponentë)
fshije(Komponentë)
merreFëmijën(int)

Gjeth Kompozit
operacioni() shtoje(Komponentë)
fshije(Komponentë)
merreFëmijën(int)
operacioni()
Kryengul n’Paternat e Dizajnit 34 / 70

Shembull:

Kameriere
KomponentëEMenysë

merreEmrin()
merrePërshkrimin()
merreÇmimin()
ështëVegjetariane()
printoje()
shtoje(KomponentëEMenysë)
hiqe(KomponentëEMenysë)
merreFëmijën(int)

ElementIMenysë Meny
merreEmrin() merreEmrin()
merrePërshkrimin() merrePërshkrimin()
merreÇmimin() printoje()
ështëVegjetariane() shtoje(KomponentëEMenysë)
printoje() hiqe(KomponentëEMenysë)
merreFëmijën(int)
Kryengul n’Paternat e Dizajnit 35 / 70

10. Paterni Gjendja - Gjendja e gjërave

Duke e enkapsulu secilën gjendje në klasë, ne lokalizojmë çfarëdo


Paternat OO
ndryshime që do të duhet m’u bë.
Gjendja (State)
Paternat Gjendja dhe Strategjia e kanë diagramin e njëjtë të
Lejoja një objekti me ndryshu sjelljen e vet kur ndryshon klasave, por ato dallojnë në qëllim.
gjendja e tij e brendshme. Objekti do të duket se e ka
Paterni Strategjia zakonisht i konfiguron klasat Kontekst me një
ndërru klasën e vet.
sjellje apo algoritëm.

Paterni Gjendja e lejon një Kontekst me ndryshu gjendjen e vet


derisa ndryshon gjendja e Kontekstit.
Pikat kryesore
Tranzicionet e gjendjeve munden m’u kontrollu nga klasat
Gjendje apo nga klasat Kontekst.
Paterni Gjendja ia lejon një objekti me pasë shumë sjellje të
ndryshme që bazohen në gjendjen e tij të brendshme. Përdorimi i Paternit Gjendja zakonisht ka me rezultu në numër
më të madh të klasave në dizajnin tuaj.
Për dallim nga një makinë procedurale e gjendjes, Paterni Gjedja
e reprezenton gjendjen si një klasë plotësisht të zhvilluar. Klasat Gjendje munden m’u bashkëpërdorë ndërmjet instancave
Kontekst.
Konteksti e siguron sjelljen e vet duke delegu te objekti i gjendjes
aktuale me të cilin është i kompozuar.
Kryengul n’Paternat e Dizajnit 36 / 70

Diagrami i klasave:

Kontekst Gjendje
kërkesa() trajtoje()

GjendjeKonkreteA GjendjeKonkreteB
gjendja.trajtoje() trajtoje() trajtoje()
Kryengul n’Paternat e Dizajnit 37 / 70

Shembull:

MakinëETopaveÇamçakëza <<interface>>
kërkesa() Gjendje
futeMonedhën()
nxjerreMonedhën() GjendjeFitues
silleDorezën() futeMonedhën()
jepeÇamçakëzin() nxjerreMonedhën()
silleDorezën()
jepeÇamçakëzin()

GjendjeUShit GjendjeUHarxhuan GjendjePaMonedhë GjendjeKaMonedhë


futeMonedhën() futeMonedhën() futeMonedhën() futeMonedhën()
nxjerreMonedhën() nxjerreMonedhën() nxjerreMonedhën() nxjerreMonedhën()
silleDorezën() silleDorezën() silleDorezën() silleDorezën()
jepeÇamçakëzin() jepeÇamçakëzin() jepeÇamçakëzin() jepeÇamçakëzin()
Kryengul n’Paternat e Dizajnit 38 / 70

11. Paterni Proxy (Përfaqësuesi) - Kontrollimi i qasjes në objekt

Përfaqësuesi Mbrojtës (Protective Proxy) e kontrollon qasjen në


Paternat OO
metodat e një objekti varësisht nga thirrësi.

Përfaqësuesi (Proxy) Ekzistojnë shumë varianta të tjera të Paternit Përfaqësuesi duke i


përfshi caching proxies, synchronization proxies, firewall proxies,
Ofroje një zëvendësues apo "ushtrues detyre" për një
copy-on-write proxies, e kështu me radhë.
objekt tjetër për me kontrollu qasjen te ai (dmth.
përfaqësuesi e kontrollon qasjen për te i përfaqësuari) Përfaqësuesi është strukturalisht i ngjashëm me Dekoratorin, por
ata dallojnë në qëllimin e tyre.

Paterni Dekoratori i shton sjellje një objekti, ndërsa Përfaqësuesi


Pikat kryesore e kontrollon qasjen.

Përkrahja e integruar në Java për Përfaqësues mundet me ndërtu


Paterni Përfaqësuesi e ofron një reprezentues për një objekt një klasë të përfaqësuesit dinamik në momentin e kërkesës dhe
tjetër në mënyrë që me kontrollu qasjen e klientit tek ai. Ka një të gjitha thirrjet që i bëhen asaj me ia përcjellë një trajtuesi që e
numër të mënyrave për me u menaxhu ajo qasje. zgjedhni ju.
Përfaqësuesi në Distancë (Remote Proxy) e menaxhon Si çdo mbështjellës, përfaqësuesit do ta rrisin numrin e klasave
interaksionin ndërmjet një klienti dhe një objekti në distancë. dhe të objekteve në dizajnet tuaja.
Përfaqësuesi Virtual (Virtual Proxy) e kontrollon qasjen në një
objekt që është i shtrejtë për me instancinu.
Kryengul n’Paternat e Dizajnit 39 / 70

Diagrami i klasave: Shembull:

<<interface>> <<interface>>
Subjekt Ikonë
kërkesa() merreGjerësinë()
merreLartësinë()
vizatojeIkonën()

subjekti subjekti
SubjektReal Përfaqësues IkonëEFotos PërfaqësuesIFotos
kërkesa() kërkesa() merreGjerësinë() merreGjerësinë()
merreLartësinë() merreLartësinë()
vizatojeIkonën() vizatojeIkonën()
Kryengul n’Paternat e Dizajnit 40 / 70

12. Paternat e përbëra - Paternat e paternave

Një Patern i Përbërë i kombinon dy apo më shumë paterna në një zgjidhje që e zgjidh një problem përsëritës apo të përgjithshëm.

Pikat kryesore Pamja e përdor Paternin Kompoziti për me implementu


ndërfaqen e përdoruesit (user interface), që zakonisht përbëhet
nga komponenta të ndërfutura siç janë panelat, kornizat dhe
Paterni Model View Controller (Model Pamje Kontrollues) apo
butonat.
MVC është patern i përbërë që përbëhet nga paternat Vëzhguesi,
Strategjia dhe Kompoziti. Këto paterna punojnë bashkë për m’i shçiftu tre lojtarët në
modelin MVC, gjë që i mban dizajnet të pastra dhe fleksibile.
Modeli e përdor Paternin Vëzhguesi ashtu që të mundet m’i
mbajtë të informuar vëzhguesit e megjithatë me mbetë i palidhur Paterni Adapteri mundet m’u përdorë për me adaptu një model
(decoupled, i shçiftuar) me ta. të ri me një pamje apo kontrollues ekzistues.

Kontrolluesi është strategjia për pamjen. Pamja mundet me Model 2 është adaptim i MVC për aplikacione web.
përdorë implementime të ndryshme të kontrolluesit për me
marrë sjellje të ndryshme. Në Model 2, kontrolluesi implementohet si servlet dhe JSP &
HTML e implementojnë pamjen.
Kryengul n’Paternat e Dizajnit 41 / 70

Diagrami i klasave:

Kontrollues

Pamje Model

Diagrami i klasave me vëzhguesin:

Kontrollues

Pamje Model
<<interface>>
Vëzhgues
freskoje()
Kryengul n’Paternat e Dizajnit 42 / 70

Rolet e komponentave në MVC:


Kryengul n’Paternat e Dizajnit 43 / 70

Kontrolluesi
Shembull: Përdorimi i MVC për me kontrollu ritmin <<interface>> VozitjaTestuesePërDJ
InterfejsKontrollues kontrolluesi
main(String[] args)
nise()
ndale()
rritiRRNM()
zvogëlojiRRNM()

modeli
caktojiRRNM(int rrnm)

Modeli
<<interface>>
KontrolluesIRitmit InterfejsModelIRitmit
nise() inicializohu()
ndale() on()
rritiRRNM() off()
zvogëlojiRRNM() caktoRRNM(int rrnm)
caktojiRRNM(int rrnm) merriRRNM()
regjistrojeVëzhguesin(VëzhguesIRitmit v)
fshijeVëzhguesin(VëzhguesIRitmit v)
regjistrojeVëzhguesin(VëzhguesIRrahjeve v)
fshijeVëzhguesin(VëzhguesIRrahjeve v)

ModelIRitmit
sekuenceri
sekuenca
Pamja mi t
tERit pikaMuzikore
si
ue ut
ë inicializohu()
PamjaDJ hg in
vëz M on()
krijojePamjen()
e Në off()
krijojiKontrollat() <<interface>> ev caktoRRNM(int rrnm)
VëzhguesIRitmit a hj
aktivizojeElementinEMenysëNdale()
Rr merriRRNM()
çaktivizojeElementinEMenysëNdale() freskojeRitmin() ti E regjistrojeVëzhguesin(VëzhguesIRitmit v)
aktivizojeElementinEMenysëNise() u es
fshijeVëzhguesin(VëzhguesIRitmit v)
çaktivizojeElementinEMenysëNise() zhg
vë regjistrojeVëzhguesin(VëzhguesIRRNM v)
actionPerformed(ActionEvent ngjarja) <<interface>> fshijeVëzhguesin(VëzhguesIRRNM v)
freskojiRRNM() VëzhguesIRrahjeve njoftojiVëzhguesitERitmit()
freskojeRitmin() njoftojiVëzhguesitERRNM()
freskojiRRNM()
// metodat e ritmit MIDI...
Kryengul n’Paternat e Dizajnit 44 / 70

VozitjaTestuesePërZemër
main(String[] args)
Shembull tjetër: Rrahjet e zemrës llue
si
t ro
Kontrolluesi k on

modeliZemër
<<interface>>
InterfejsKontrollues
nise()
ndale() Modeli
rritiRRNM()
zvogëlojiRRNM() <<interface>>
caktojiRRNM(int rrnm) InterfejsModelIZemrës
merreTemponEZemrës()
regjistrojeVëzhguesin(VëzhguesIRitmit v)
fshijeVëzhguesin(VëzhguesIRitmit v)
regjistrojeVëzhguesin(VëzhguesIRrahjeve v)
fshijeVëzhguesin(VëzhguesIRrahjeve v)
KontrolluesIZemrës
nise()
ndale()
rritiRRNM()
zvogëlojiRRNM()
caktojiRRNM(int rrnm) ModelIZemrës
koha
rrahjeNëMinutë ze
t m
t mi //... ra
Ri
s i tE merreTemponEZemrës()

ë
ue AdapterIZemrës
ut
g regjistrojeVëzhguesin(VëzhguesIRitmit v)
Pamja zh M
in
vë fshijeVëzhguesin(VëzhguesIRitmit v) inicializohu() { }
ë
eN

<<interface>> regjistrojeVëzhguesin(VëzhguesIRrahjeve v) on() { }


PamjaDJ
ev

VëzhguesIRitmit off() { }
hj

fshijeVëzhguesin(VëzhguesIRrahjeve v)
ra

krijojePamjen() caktoRRNM(int rrnm) { }


R

freskojeRitmin()
itE

krijojiKontrollat() merriRRNM()
es

aktivizojeElementinEMenysëNdale()
gu

{ zemra.merreTemponEZemrës() }
zh

çaktivizojeElementinEMenysëNdale() <<interface>> regjistrojeVëzhguesin(VëzhguesIRitmit v)


aktivizojeElementinEMenysëNise() <<interface>>
VëzhguesIRRNM InterfejsModelIRitmit fshijeVëzhguesin(VëzhguesIRitmit v)
çaktivizojeElementinEMenysëNise() regjistrojeVëzhguesin(VëzhguesIRRNM v)
actionPerformed(ActionEvent ngjarja) freskojiRRNM() inicializohu()
on() fshijeVëzhguesin(VëzhguesIRRNM v)
freskojiRRNM()
freskojeRitmin() off()
caktoRRNM(int rrnm)
merriRRNM()
regjistrojeVëzhguesin(VëzhguesIRitmit v)
fshijeVëzhguesin(VëzhguesIRitmit v)
regjistrojeVëzhguesin(VëzhguesIRrahjeve v)
fshijeVëzhguesin(VëzhguesIRrahjeve v)
Kryengul n’Paternat e Dizajnit 45 / 70

13. Jetesa më e mirë me paterna - Paternat në botën reale

Patern është një zgjidhje e një problemi në një kontekst. Duhet me qenë i përkushtuar për me qenë shkrues i paternave:
kjo merr kohë e durim, dhe duhet me qenë i gatshëm me bë
Lejoji Paternat e Dizajnit me dalë natyrshëm në dizajnet tua, mos shumë përsosje.
i fut me zor vetëm për hatër se duhet me përdorë një patern.
Mbaje në mend, shumica e paternave që do t'i hasësh do të jenë
Paternat e Dizajnit nuk janë të gdhendura në gur; adaptoji dhe adaptime të paternave ekzistuese, jo paterna të reja.
rregulloji ato për m’i plotësu nevojat e tua.
Ndërtoje fjalorin e përbashkët të ekipit tënd. Ky është një nga
Gjithmonë përdore zgjidhjen më të thjeshtë që i plotëson nevojat benefitet më të fuqishme të përdorimit të paternave.
e tua, edhe nëse ajo nuk e përfshin një patern.
Si çdo komunitet, komuniteti i paternave e ka zhargonin e vet.
Studioji katalogjet e Paternave të Dizajnit për me familiarizu Mos e lejo që kjo me të frenu. Meqë e ke lexu këtë libër, tash e di
veten me paternat dhe relacionet ndërmjet tyre. shumicën e tij.
Klasifikimet e paternave (apo kategoritë) ofrojnë grupime të
paternave. Kur ato ndihmojnë, përdori.
Kryengul n’Paternat e Dizajnit 46 / 70

Banda e Katërshes (Gang of Four, GoF):


Kryengul n’Paternat e Dizajnit 47 / 70

14. Shtojcë: Paternat e mbetura jashtë

Ura (Bridge)
Përdoreni Paternin Ura për m’i ndryshu jo vetëm implementimet tuaja, por edhe abstraksionet tuaja. DigitronPërTV
on()
off()
caktojeKanalin()
Një skenar // metoda tjera
Paramendojeni se do ta revolucionarizoni "relaksimin ekstrem me TV". Jeni duke e shkru kodin për një
digitron të ri për televizorë, që është ergonomik dhe miqësor për përdoruesin. Tashmë e dini se duhet m’i
përdorë teknikat e mira OO sepse derisa digitroni është i bazuar në abstraksionin e njëjtë, do të ketë
shumë implementime - nga një për secilin model të televizorit. DigitronRCA DigitronSony
on() on()
off() off()
caktojeKanalin() caktojeKanalin()
Dilema juaj // metoda tjera // metoda tjera
E dini se interfejsi për përdorues i digitronit nuk do të jetë i saktë herën e parë. Në fakt, ju pritni që
produkti do të përsoset shumë herë derisa mbledhen shënime të përdorshmërisë për digitronin.
{
Pra dilema juaj është që digitronat do të ndryshojnë dhe televizorët do të ndryshojnë. Ju tashmë e keni
qiteKanalin(kanali);
abstraktu interfejsin e përdoruesit ashtu që mundeni me ndryshu implementimin nëpër shumë televizorë }
që do t'i posedojnë klientët tuaj. Por po ashtu do të ju duhet me ndryshu abstraksionin sepse edhe ai do
të ndryshojë me kalimin e kohës meqë digitroni do të përmirësohet në bazë të reagimit të përdoruesve.

Pra si do ta krijoni një dizajn OO që jua lejon me ndryshu implementimin dhe abstraksionin?
Kryengul n’Paternat e Dizajnit 48 / 70

Pse me përdorë Paternin Ura?

Paterni Ura jua lejon me ndryshu implementimin dhe abstraksionin duke i vendosë këto dyja në hierarki të ndryshme të klasave.

DigitronPërTV
pajisja E-ka-Një TV
(Has-A) on()
off()
on()
qiteKanalin()
off() pajisja.qiteKanalin(kanali); // metoda tjera
caktojeKanalin()
// metoda tjera

RCA Sony
on() on()
DigitronKonkret off() off()
qiteKanalin() qiteKanalin()
stacioniAktual
// metoda tjera // metoda tjera

on()
off()
caktojeStacionin() caktojeKanalin(stacioniAktual + 1)
kanaliTjetër()
kanaliIMëparshëm()
// metoda tjera

Tash i keni dy hierarki, një për digitronat dhe një të veçantë për implementimet specifike të televizorëve sipas platformave. Ura jua lejon me ndryshu
cilëndo anë të hierarkive në mënyrë të pavarur.
Kryengul n’Paternat e Dizajnit 49 / 70

Dobitë e Urës Përdorimet dhe mangësitë e Urës

E shçifton një implementim ashtu që nuk është i lidhur në mënyrë E dobishme në sistemet grafike dhe të dritareve që duhet m’u
të përhershme me një interfejs. ekzekutu në shumë platforma.

Abstraksioni dhe implementimi munden m’u zgjeru në mënyrë të E dobishme kurdo që ju nevojitet me ndryshu një interfejs dhe
pavarur. një implementim në mënyra të ndryshme.

Ndryshimet në klasat konkrete të abstraksionit nuk ndikojnë te E rrit kompleksitetin.


klienti.
Kryengul n’Paternat e Dizajnit 50 / 70

Ndërtuesi (Builder)

Përdore paternin Ndërtuesi për me enkapsulu konstruktimin e një produkti dhe me leju m’u konstruktu nëpër hapa.

Një skenar
Sapo të kanë kërkuar me ndërtu një planifikues të pushimit për Tokën e biletave për hyrje, me bë rezervime në restorante, dhe bile m’u regjistru
Paternave, një park tematik afër Qytetit të Objekteve (Objectville). edhe në ngjarje speciale. Për me kriju një planifikues të pushimit, duhesh
Mysafirët e parkut munden me zgjedhë një hotel dhe tipe të ndryshme të me qenë i aftë me kriju struktura si kjo:

Pushimi

DitaNjë DitaDy DitaTre

Biletat e Ngjarja
Hoteli
Parkut Speciale
Biletat e Biletat e
Hoteli Darkimi Hoteli Ngjarja
Parkut Parkut Darkimi
Speciale

Cirku i
Darka Paternave
Paternat
Darka
në Akull
Kryengul n’Paternat e Dizajnit 51 / 70

Të nevojitet dizajn fleksibil Pse me përdorë Paternin Ndërtuesi?


Planifikuesi i secilit mysafir mundet me ndryshu në numrin e ditëve dhe A të kujtohet Iteratori? Ne e enkapsuluam iterimin në një objekt të
tipet e aktiviteteve që i përfshin. Për shembull, një banor lokal mundet veçantë dhe e fshehëm përfaqësimin e brendshëm të koleksionit nga
mos me pasë nevojë për hotel, por dëshiron me bë rezervime për darka klienti. Është ideja e njëjtë këtu: e enkapsulojmë krijimin e planifikuesit të
dhe për ngjarje speciale. Një tjetër mysafir mundet me qenë duke fluturu ekskursionit në një objekt (le ta quajmë ndërtues), dhe ia lëmë klientit
në Qytetin e Objekteve dhe i nevojitet një hotel, rezervimet e darkave, tonë të kërkojë nga ndërtuesi me konstruktu strukturën e planifikuesit të
dhe biletat për hyrje. ekskursionit për të.

Pra, të nevojitet një strukturë fleksibile e shënimeve që mundet m’i


paraqitë planifikuesit e mysafirëve dhe të gjitha variantat e tyre; po ashtu
duhesh me përcjellë një sekuencë të hapave potencialisht kompleksë për
me kriju planifikuesin. Qysh mundesh me ofru një mënyrë për me kriju
strukturën komplekse pa e përzi atë me hapat për krijimin e saj?

ndërtuesi
Klient NdërtuesAbstrakt
konstruktojePlanifikuesin() ndërtojeDitën()
shtojeHotelin()
shtojeRezervimin()
shtojeNgjarjenSpeciale()
shtojiBiletat()
merrePlanifikuesinEPushimeve()

ndërtuesi.ndërtojeDitën(data);
ndërtuesi.shtojeHotelin(data, “Fasaduesi i Madh”);
ndërtuesi.shtojiBiletat(“Paternat në Akull”);
NdërtuesIPushimeve
// planifikoje pjesën tjetër të pushimit pushimi
Planifikues planifikuesiJuaj =
ndërtuesi.merrePlanifikuesinEPushimeve(); ndërtojeDitën()
shtojeHotelin()
shtojeRezervimin()
shtojeNgjarjenSpeciale()
shtojiBiletat()
merrePlanifikuesinEPushimeve()
Kryengul n’Paternat e Dizajnit 52 / 70

Dobitë e Ndërtuesit Përdorimet dhe mangësitë e Ndërtuesit

E enkapsulon mënyrën se qysh konstruktohet një objekt Shpesh përdoret për m’i ndërtu strukturat kompozite.
kompleks
Konstruktimi i objekteve kërkon më shumë njohuri të domenit
Ia lejon objekteve m’u konstruktu në një proces me shumë hapa nga klienti se sa kur përdoret një Fabrikë.
dhe të ndryshueshëm (për dallim nga fabrikat me një hap)

E fsheh paraqitjen e brendshme të produktit nga klienti

Implementimet e produktit munden m’u ndërru sipas dëshirës


sepse klienti e sheh vetëm një interfejs abstrakt.
Kryengul n’Paternat e Dizajnit 53 / 70

Zingjiri i përgjegjësisë (Chain of responsibility)

Përdore Paternin Zingjiri i Përgjegjësisë kur dëshiron me ia dhënë rastin më shumë se një objekti për me trajtu një kërkesë.

Një skenar Qysh me përdorë Paternin Zingjiri i Përgjegjësisë


Topi i Fuqishëm Çamçakëz po merr më shumë emaila se që mundet m’i Me Paternin Zingjiri i Përgjegjësisë, ju e krijoni një zingjir të objekteve që
trajtu që nga publikimi i Makinës së Topave Çamçakëz të fuqizuar me e kontrollojnë një kërkesë. Secili objekt me radhë e kontrollon kërkesën
Java. Nga analizat e veta ata i marrin katër lloje të emailave: letra nga dhe e trajton atë, ose ia kalon objektit tjetër në zingjir.
tifozët të cilëve iu pëlqen loja e re 1 në 10, ankesat nga prindërit fëmijët e
të cilëve janë të dhënë pas lojës dhe kërkesat për me vendosë makina në
lokacione të reja. Ata po ashtu marrin një sasi të konsiderueshme të
spamit.

Të gjithë emailat e tifozëve duhet me shku drejt te Drejtori Ekzekutiv


(CEO), të gjitha ankesat shkojnë te departamenti ligjor dhe të gjitha
kërkesat për makina të reja shkojnë te zhvillimi i biznesit. Spami duhet
m’u fshi.

Detyra jote
Topi i Fuqishëm Çamçakëz tashmë i ka shkru disa detektorë IA
(Inteligjencë Artificiale) që munden me tregu se a është një email spam,
letër e tifozit, ankesë, apo kërkesë, por ata kanë nevojë që ti me kriju një
dizajn që mundet m’i përdorë detektorët për me trajtu emailin që vjen.
Kryengul n’Paternat e Dizajnit 54 / 70

Trajtues
pasardhësi

trajtojeKërkesën()

TrajtuesISpamit TrajtuesITifozit TrajtuesIAnkesës TrajtuesILokTëRi


trajtojeKërkesën() trajtojeKërkesën() trajtojeKërkesën() trajtojeKërkesën()

Kur emaili pranohet, ai i jepet trajtuesit të parë; TrajtuesISpamit. Nëse TrajtuesISpamit nuk mundet me trajtu kërkesën, ajo i kalohet TrajtuesitTëTifozit. Dhe
kështu me radhë...

Trajtues i Trajtues i Trajtues i Trajtues i


Spamit Tifozit Ankesës Lok. të Ri
Kryengul n’Paternat e Dizajnit 55 / 70

Dobitë e Zingjirit të Përgjegjësisë Përdorimet dhe mangësitë e Zingjirit të Përgjegjësisë

E shçifton dërguesin e kërkesës dhe pranuesit e saj. Përdoret përgjithësisht në sistemet me dritare për m’i trajtu
ngjarjet si klikat e mausit dhe ngjarjet e tastierës.
E thjeshton objektin tuaj sepse nuk duhet me ditë strukturën e
zingjirit dhe m’i mbajtë referencat e drejtpërdrejta në anëtarët e Ekzekutimi i kërkesës nuk është i garantuar: mundet me ra në
tij. fund të zingjirit nëse nuk e trajton asnjë objekt (kjo mundet me
qenë përparësi apo mangësi).
Ju lejon me shtu apo me heqë përgjegjësi në mënyrë dinamike
duke i ndryshu anëtarët apo renditjen e zingjirit. Mundet me qenë vështirë m’i vëzhgu karakteristikat e kohës së
ekzekutimit dhe me debagu (m’i rregullu gabimet).
Kryengul n’Paternat e Dizajnit 56 / 70

Peshë-miza (Flyweight)

Përdore Paternin Peshë-miza (Flyweight, boksier i kateg. Mizë) kur një instancë e një klase mundet m’u përdorë për me ofru shumë "instanca virtuale”.

Një skenar

Dëshiron me shtu pemë si objekte në aplikacionin tënd të fortë të ri të dinamikisht, varësisht se sa të vjetër janë. Puna është se, një përdorues
dizajnit të peisazheve. Në aplikacionin tënd, drunjtë nuk bëjnë mundet me dashtë me pasë shumë e shumë pemë në një nga dizajnet e
kushediçka; ata e kanë një lokacion X-Y, dhe munden me vizatu vetëveten tij të pejsazhit të shtëpisë. Ai mundet m’u dokë kështu disi:

Pemë
Dilema e klientit tënd të madh
Pemë Pemë Ti sapo e marrë klientin tënd që do të
jetë referencë e madhe. Atë klientin
kryesor që je duke e trajtu qe disa
Pemë
muaj. Ata do t'i blejnë 1000 ulëse të
aplikacionit tënd, dhe janë duke e
Pemë përdorë softuerin tuaj për me bë
koordX dizajnin e pejsazheve për komunitetet
koordY
e mëdha të planifikuara. Pasi e ka
Pemë mosha
Shtëpi përdorë softuerin tuaj një javë, klienti
shfaqe()
{ juaj po ankohet se kur po krijojnë
// përdori llogaritjet komplekse pemishte të mëdha me pemë,
// me koordinatat X-Y
Pemë aplikacioni po fillon m’u kadalu...
// dhe moshën
Pemë
}
Kryengul n’Paternat e Dizajnit 57 / 70

Pse me përdorë Paternin Peshë-miza?

Çka nëse, në vend se m’i pasë mijëra objekte Pemë, ti kishe mujtë me ridizajnu sistemin tënd ashtu që ti me pasë vetëm një instancë të Pemës, dhe një
objekt klient që e mirëmban gjendjen e TË GJITHA Pemëve tuaja? Kjo është Peshë-miza!

MenaxherIPemëve
Pemë
varguIPemëve
shfaqe()
{
// përdori llogaritjet komplekse
shfaqiPemët()
// me koordinatat X-Y
{
// dhe moshën
// për të gjitha pemët
}
{ // merre rreshtin e vargut
shfaqe(x, y, mosha)
}
}

Dobitë e Peshë-mizës Përdorimet dhe mangësitë e Peshë-mizës

E zvogëlon numrin e instancave të objekteve gjatë kohës së Peshë-miza përdoret kur një klasë ka shumë instanca, dhe të
ekzekutimit, duke e ruajtë memorjen. gjitha ato munden m’u kontrollu në mënyrë identike.

E centralizon gjendjen për shumë objekte "virtuale" në një Një mangësi e paternit Peshë-miza është se pasi ta implementoni
lokacion të vetëm. një herë, instancat e vetme logjike të klasës nuk do të mundin
m’u sjellë në mënyrë të pavarur nga instancat tjera.
Kryengul n’Paternat e Dizajnit 58 / 70

Interpretuesi (Interpreter)

Përdore Paternin Interpretuesi (Interpreter) për me ndërtu një interpretues për një gjuhë.

shprehje ::= <komandë> | <sekuencë> | <përsëritje>

Relaksohu sekuencë ::= <shprehje> ';' <shprehje>


Paterni Interpretuesi i kërkon disa njohuri për gramatikat formale. Nëse
komandë ::= djathtas | kuako | fluturo
kurrë nuk i ke studiu gramatikat formale, vazhdo dhe lexoje paternin;
prapë ke me kuptu thelbin e saj. përsëritje ::= derisa '(' <ndryshore> ')' <shprehje>

ndryshore ::= [A-Z,a-z]+

Një skenar
A ju kujtohet Simulatori i Liqenthit të Rosave? E ke një parandjenjë se ai
Tash çka?
kish mujtë me qenë vegël e shkëlqyeshme edukative për fëmijët për me
E ke një gramatikë; tash krejt çka të nevojitet është një mënyrë m’i
mësu programimin. Duke e përdorë simulatorin, secili fëmijë mundet me
paraqitë dhe m’i interpretu fjalitë në gramatikë ashtu që studentët
kontrollu një rosë me një gjuhë të thjeshtë. Qe një shembull i gjuhës:
munden m’i pa efektet e programimit të tyre në rosat e simuluara.

djathtas;
Qysh me implementu një interpretues
derisa (ditë) fluturo; Kur të nevojitet me implementu një gjuhë të thjeshtë, Paterni
Intepretuesi e definon një paraqitje të bazuar në klasa për gramatikën e
kuako;
saj bashkë me një interpretues për m’i interpretu fjalitë e saj. Për me
paraqitë një gjuhë, e përdor nga një klasë për me paraqitë secilin rregull
në gjuhë. Qe ku është gjuha e rosave e përkthyer në klasa. Vëreje
Tash, duke e kujtu se qysh me kriju gramatika prej njërës nga lëndët e tua mapimin direkt me gramatikën.
të vjetra të hyrjes në programim, e shkruan gramatikën:
Kryengul n’Paternat e Dizajnit 59 / 70

Shprehje
interpretoje(konteksti)

Përsëritje Sekuencë
ndryshorja shprehja1
shprehja shprehja2
interpretoje(konteksti) interpretoje(konteksti)

Ndryshore KomandëKuako KomandëDjathtas KomandëFluturo


interpretoje(konteksti) interpretoje(konteksti) interpretoje(konteksti) interpretoje(konteksti)

Për me interpretu gjuhën, thirre metodën interpretoje() në secilin tip të hyrëse të programit të cilin jemi duke e e analizu gramatikisht (duke e
shprehjes. Kësaj metode i jepet një kontekst - që e përmban rrjedhën parsu) - dhe ajo e përputh hyrjen (inputin) e saj dhe e vlerëson atë.
Kryengul n’Paternat e Dizajnit 60 / 70

Dobitë e Interpretuesit Përdorimet dhe mangësitë e Interpretuesit

Paraqitja e secilit rregull të gramatikës në një klasë e bën të lehtë Përdore interpretuesin kur të nevojitet me implementu një gjuhë
implementimin e gjuhës. të thjeshtë.

Meqë gramatika është e paraqitur nga klasat, mundesh lehtë me Është i përshtatshëm kur e ke një gramatikë të thjeshtë dhe
ndryshu apo me zgjeru gjuhën. thjeshtësia është më e rëndësishme se efikasiteti.

Duke shtu metoda shtesë në strukturën e klasës, mundesh me Përdoret për gjuhët skriptuese dhe programuese.
shtu sjellje të reja përtej interpretimit, siç është printimi i bukur
dhe validimi më i sofistikuar i programit. Ky patern mundet m’u bë i pavolitshëm atëherë kur numri i
rregullave të gramatikës është i madh. Në këto raste mundet me
qenë më i përshtatshëm një gjenerues parser/kompajler.
Kryengul n’Paternat e Dizajnit 61 / 70

Ndërmjetësuesi (Mediator)

Përdore Paternin Ndërmjetësuesi për m’i centralizu komunikimet dhe kontrollin kompleks ndërmjet objekteve të ndërlidhura.

Një skenar Alarm


AparatIKafes
Bobi e ka një shtëpi automatike me Java, duke iu falënderu nëNgjarje()
nëNgjarje() {
njerëzve të mirë nga ShtëpiaEArdhmërisë. Të gjitha pajisjet e tij { kontrollojeKalendarin()
kontrollojeKalendarin()
janë të dizajnuara për me bë jetën e tij më të lehtë. Kur Bobi e kontrollojeAlarmin()
kontrollojeStërpikësin() // bëj gjëra tjera
ndal trusjen e butonit snooze (dremit), ora e tij e alarmit i thotë niseKafen() }
aparatit të kafes me fillu me përgatitë kafen. Edhe pse jeta është // bëj gjëra tjera
} Alarm
e mirë për Bobin, ai dhe klientët tjerë gjithmonë kërkojnë shumë
Aparat
veçori të reja: Mos me bë kafe fundjavave... Ndale stërpikësin 15 IKafes
minuta para kohës kur është caktu një tush... Caktoje alarmin
herët në ditët e punës...

Dilema e ShtëpisëSëArdhmërisë
Po bëhet vërtet vështirë me përcjellë se cilat rregulla qëndrojnë
Kalendar Stërpikës
në cilat objekte, dhe qysh do të duhej m’u lidhë objektet e
Kalendar Stërpikës
ndryshme me njëri-tjetrin.
nëNgjarje() nëNgjarje()
{ {
kontrollojeDitënEJavës() kontrollojeKalendarin()
bëjeStërpikjen() kontrollojeStërpikjen()
bëjeKafen() kontrollojeTemperaturën()
niseAlarmin() kontrollojeKohën()
// bëj gjëra tjera // bëj gjëra tjera
} }
Kryengul n’Paternat e Dizajnit 62 / 70

Ndërmjetësuesi në aksion
Me një Ndërmjetësues që i shtohet sistemit, të gjitha objektet e pajisjeve
munden m’u thjeshtu në masë të madhe: Para se me shtu Ndërmjetësuesin, të gjitha objektet e pajisjeve duhej me
ditë për njëri-tjetrin... të gjitha ato ishin të çiftuara ngusht. Me
Ato i tregojnë Ndërmjetësit kur ndryshon gjendja e tyre Ndërmjetësuesin, objektet e pajisjeve janë të shçiftuara plotësisht nga
njëri-tjetri.
Ato i përgjigjen kërkesave nga Ndërmjetësi
Ndërmjetësuesi e përmban krejt logjikën e kontrollit për krejt sistemin.
Kur një pajisjeje ekzistuese i nevojitet një rregull e re, apo një pajisje e re i
shtohet sistemit, do ta dini se krejt logjika e nevojshme do t'i shtohet
Është çlirim kaq Ndërmjetësuesit.
i madh, mos me pasë
nevojë me iu ra në fije
atyre rregullave të
bezdisshme të asaj
ore me alarm!
Alarm
Aparat
IKafes

Ndërmjetësues
if (ngjarjeEAlarmit)
{ kontrollojeKalendarin()
Ndërmjetësues
kontrollojeDushin()
kontrollojeTemperaturën()
}
if (fundjavë)
{ kontrollojeKohën()
// bëj gjëra tjera
}
if (ditëEPunës)
Kalendar Stërpikës { ricaktojeAlarmin()
// bëj gjëra tjera
}
Kryengul n’Paternat e Dizajnit 63 / 70

Dobitë e Ndërmjetësuesit Përdorimet dhe mangësitë e Ndërmjetësuesit

E rrit ripërdorshmërinë e objekteve të përkrahura nga Ndërmjetësuesi përdoret përgjithësisht për m’i koordinu
Ndërmjetësuesi duke i shçiftu ato nga sistemi. komponentat e ndërlidhura GUI (të ndërfaqes grafike).

E thjeshton mirëmbajtjen e sistemit duke e centralizu logjikën e Një mangësi e paternit Ndërmjetësuesi është se pa dizajn të
kontrollit. duhur, vetë objekti Ndërmjetësues mundet m’u bë tepër
kompleks.
E thjeshton dhe e zvogëlon shumëllojshmërinë e mesazheve që
dërgohen nga objektet në sistem.
Kryengul n’Paternat e Dizajnit 64 / 70

Përkujtuesi (Memento)
Përdore Paternin Memento kur të nevojitet me mujtë me kthy një objekt në një nga gjendjet e tij të mëparshme; për shembull, nëse përdoruesi juaj e
kërkon një "zhbërje" ("undo").

Një skenar
Loja jote interaktive e luajtjes së roleve është shumë e suksesshme, dhe e Duke e mbajtë në mend principin e përgjegjësisë së vetme, është po
ka kriju një legjion të personave të dhënë pas saj, të gjithë duke u mundu ashtu ide e mirë me mbajtë gjendjen që po e ruan të ndarë nga objekti
me mbërri te "niveli 13" legjendar. Derisa përdoruesit përparojnë në kryesor. Ky objekt i ndarë që e mban gjendjen është i njohur si objekti
nivele më sfiduese të lojës, gjasat për me hasë një situatë që e përfundon Përkujtues (Memento).
lojën rriten. Tifozët që kanë kalu ditë të tëra duke përparu në një nivel të
avansuar inatosen në mënyrë të kuptueshme kur karakteri i tyre digjet,
dhe ata duhet me ia nisë prej fillimit. Kërkesa dëshpëruese është për një
komandë "ruaje progresin", ashtu që lojtarët të munden me ruajtë
progresin e lojës së vet dhe të paktën m’i rikthy shumicën e përpjekjeve
të tyre kur karakteri i tyre asgjësohet në mënyrë të padrejtë. Funksioni
"ruaje progresin" duhet m’u dizajnu për me kthy një lojtare të ringjallur
në nivelin e fundit që ajo e ka kry në mënyrë të suksesshme.

Përkujtuesi në punë
Përkujtuesi i ka dy qëllime:

Me ruajtë gjendjen e rëndësishme të një objekti kryesor të


sistemit

Me mirëmbajtë enkapsulimin e objektit kryesor.


Kryengul n’Paternat e Dizajnit 65 / 70

MementoELojës

gjendjaERuajturELojës

Klient ObjektKryesorILojës

// kur të arrihet nivel i ri gjendjaELojës


Object e_ruajtura =
(Object) okl.merreGjendjenAktuale(); Object merreGjendjenAktuale()
{ // mbledhe gjendjen
// kur kërkohet një rikthim return gjendjaELojës;
okl.rikthejeGjendjen(e_ruajtura); }

rikthejeGjendjen(Object gjendjaERuajtur)
{ // riktheje gjendjen
}

// bëj gjëra tjera të lojës

Dobitë e Mementos Përdorimet dhe mangësitë e Mementos


Mbajtja e gjendjes së ruajtur jashtë objektit kryesor ndihmon në Memento përdoret për me ruajtë gjendjen.
mirëmbajtjen e kohezionit.
Një mangësi e përdorimit të Mementos është se ruajtja dhe
I mban shënimet e objektit kryesor të enkapsuluara. rikthimi i gjendjes mundet me konsumu kohë.

Ofron mundësi të rikthimit që është lehtë me implementu. Në sistemet Java, konsideroni me përdorë serializimin
(Serialization) për me ruajtë një gjendje të sistemit.
Kryengul n’Paternat e Dizajnit 66 / 70

Prototipi (Prototype)
Përdore Paternin Prototipi kur krijimi i instancës së një klase të dhënë është ose i shtrenjtë ose i komplikuar.

Një skenar
Loja jote interaktive e luajtjes së roleve ka
apetit të pangopur për përbindësha. Derisa
heronjtë e tu e bëjnë udhëtimin e tyre nëpër
një pejsazh të krijuar në mënyrë dinamike, ata
hasin në varg të pafundëm të armiqve që
duhet m’u mposhtë. Do të doje që
karakteristikat e përbindëshit me evolu me
pejsazhin që ndryshon. Nuk ka shumë kuptim
që përbindëshat e ngjashëm me zogjtë m’i
ndjekë karakteret tuaja në botëra nënujore.
Dhe në fund, do të doje me ia leju lojtarëve të
avansuar m’i kriju përbindëshat e vet
specifikë.
Kryengul n’Paternat e Dizajnit 67 / 70

Prototipi si shpëtues

Paterni Prototipi ta lejon me bë instanca të reja duke i kopju instancat këtij paterni është se kodi klient mundet me bë instanca të reja pa e ditë
ekzistuese. (Në Java kjo zakonisht dmth. me përdorë metodën clone(), se cila klasë specifike po instancinohet.
apo de-serializimin kur të nevojiten kopje të thella.) Një aspekt kryesor i

<<interface>>
Përbindësh

PërbindëshIMirënjohur PërbindëshDinamik
IGjeneruarNgaLojtari

NdërtuesIPërbindëshit
bëjeNjëPërbindëshTëRastësishëm()
{
Përbindësh p =
RegjistërIPërbindëshave.merrePërbindëshin();
}

RegjistërIPërbindëshave
Përbindësh merrePërbindëshin()
{
// gjeje përbindëshin korrekt
return përbindëshiKorrekt.clone();
}
Kryengul n’Paternat e Dizajnit 68 / 70

Dobitë e Prototipit Përdorimet dhe mangësitë e prototipit

I fsheh kompleksitetet e bërjes së instancave të reja nga klienti. Prototipi duhet m’u konsideru kur një sistem duhet me kriju
objekte të reja të shumë tipeve në një hierarki komplekse të
Ia ofron klientit opsionin me gjeneru objekte të cilave nuk iu dihet klasave.
tipi.
Një mangësi e përdorimit të Prototipit është se bërja e kopjes së
Në disa rrethana, kopjimi i një objekti mundet me qenë më efikas një objekti nganjëherë mundet me qenë e komplikuar.
sesa krijimi i një objekti të ri.
Kryengul n’Paternat e Dizajnit 69 / 70

Vizitori (Visitor)

Përdore Paternin Vizitori kur don m’i shtu mundësi një kompoziti të objekteve dhe enkapsulimi nuk është i rëndësishëm.

Një skenar Zgjidhja e propozuar nga Lou:


Klientët që e frekuentojnë Darkën në Qytetin e Objekteve (Objectville
Dinner) dhe Shtëpinë e Petullave në Qytetin e Objekteve (Objectville
Meny
Pancake House) kohëve të fundit janë bërë më të vetëdijshëm për // metodat e reja

shëndetin. Ata po kërkojnë informata nutricionale para se m’i porositë merreShkallënEShendetit


racionet e veta. Meqë të dy ndërmarrjet kaq të gatshme me kriju porosi merriKaloritë
merriProteinat
speciale, disa klientë janë duke kërku informata nutricionale edhe në merriKarbot
nivel të përbërësve. Element Element
IMenysë IMenysë
// metodat e reja

merreShkallënEShendetit
merriKaloritë
merriProteinat
merriKarbot
Përbërës Përbërës

Shqetësimet e Melit:

"More djalë, po duket sikur po e çelim kutinë e Pandorës. Kush e di se


çfarë metode të re do të duhemi me shtu më vonë, dhe çdo herë që e
shtojmë një metodë duhemi me bë në dy vende. Plus, çka nëse dojmë me
avansu aplikacionin bazë me, të themi, klasën e recetave? Atëherë do të
duhemi m’i bë këto ndryshime në tri vende të ndryshme..."
Kryengul n’Paternat e Dizajnit 70 / 70

Vizitori kalon atypari Përshkuesi për me marrë gjendjen nga të gjitha objektet në Kompozit.
Posa të mirret gjendja, Klienti mundet m’i thënë Vizitorit me kry
operacione të ndryshme në gjendje. Kur kërkohet funksionalitet i ri,
Vizitori duhet me vizitu secilin element të Kompozitit; ai funksionalitet
vetëm vizitori duhet m’u avansu.
është në objektin Përshkuesi (Traverser). Vizitori udhëheqet nga

ë n- Meny
S h ka l l
rre it()
me endet të() jendje
n
h i e rre G
ES riKalor nat() m
r i
me riProte t()
e r r b o Vizitor merreGjendjen
m riKa
r merreG
me jendjen
me
rre
Gje Element Element
m
er ndj
en IMenysë IMenysë
re
Klient / G
je
nd
Përshkues je
n

Përbërës Përbërës

Dobitë e Vizitorit Mangësitë e Vizitorit

Të lejon m’i shtu operacione një strukture Kompozit pa e ndryshu Enkapsulimi i klasave Kompozit thehet kur përdoret Vizitori.
vetë strukturën.
Meqë është i përfshirë funksioni i përshkimit, ndryshimet në
Shtuarja e operacioneve të reja është relativisht e lehtë. strukturën e Kompozitit janë më të vështira.

Kodi për operacionet që kryhen nga Vizitori është i centralizuar.

You might also like