Professional Documents
Culture Documents
konceptet kryesore
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
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
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; }
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
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.
Diagrami i klasave:
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:
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
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
Espreso PaKafeinë
kostoja() kostoja()
Pikat kryesore
Principet OO
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.
PicëMeDjath PicëMeFeferona
PicëVegjetariane PicëMeGuaca
Produkt Krijues
metodaFabrikë()
njëOperacion()
ProduktKonkret KrijuesKonkret
metodaFabrikë()
Kryengul n’Paternat e Dizajnit 16 / 70
ShitoreEPicaveNY ShitoreEPicaveÇikago
krijojePicën() krijojePicën()
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
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
Diagrami i klasës:
Singleton
static instancaUnike
static merreInstancën()
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:
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
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.
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
Adapter
kërkesa()
Kryengul n’Paternat e Dizajnit 27 / 70
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
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
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
AgregatKonkret IteratorKonkret
krijojeIteratorin() kaTjetër()
tjetri()
fshije()
Shembull:
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
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()
<<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
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.
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
Kontrollues
Pamje Model
<<interface>>
Vëzhgues
freskoje()
Kryengul n’Paternat e Dizajnit 42 / 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
VëzhguesIRitmit off() { }
hj
fshijeVëzhguesin(VëzhguesIRrahjeve v)
ra
freskojeRitmin()
itE
krijojiKontrollat() merriRRNM()
es
aktivizojeElementinEMenysëNdale()
gu
{ zemra.merreTemponEZemrës() }
zh
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
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
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
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
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.
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
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
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
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)
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ë.
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()
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ë...
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
Ç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)
}
}
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ë.
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)
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
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.
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
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:
MementoELojës
gjendjaERuajturELojës
Klient ObjektKryesorILojës
rikthejeGjendjen(Object gjendjaERuajtur)
{ // riktheje gjendjen
}
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
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.
merreShkallënEShendetit
merriKaloritë
merriProteinat
merriKarbot
Përbërës Përbërës
Shqetësimet e Melit:
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
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.