parsisiųsti skaidrę

Download Report

Transcript parsisiųsti skaidrę

Template Method
(Behavioral)
Template Method
 Apibrėžiamas algoritmo karkasas, atidedant
kai kuriuos žingsnius į subklases.
 Template Method šablonas leidžia
subklasėms iš naujo apibrėžti tam tikrus
algoritmo žingsnius, neleisdamas keisti
algoritmo struktūros.
2
Realaus pasaulio pavyzdys
3
Motyvacija
 Template – iš anksto nustatytas formatas,
naudojamas kaip pradinis taškas atitinkamos
programos kūrimui ir tokiu būdu šis formatas
neturi būti kuriamas iš naujo kiekvieną kartą,
kuomet jis yra naudojamas.
 Template Method apibrėžia algoritmus
bazinėje klasėje naudodamas abstrakčias
operacijas, kurias subklasės override‘ina,
aprūpindamos konkrečiu elgesiu.
4
Pavyzdys
 Kartais reikia specifikuoti operacijų, kurios yra
naudojamos metode, eiliškumą, tačiau leisti
subklasėms savaip realizuoti kai kurias iš šių operacijų.
5
Pavyzdys
 OpenDocument() metodas yra Template metodas.
 Template metodas užfiksuoja operacijų eiliškumą, tačiau leidžia
Application subklasėms keisti šiuos žingsnius pagal poreikius.
6
Pavyzdys
 printPage() metodas
abiejose klasėse yra beveik
toks pats.
 Kuomet matom du tokius
panašius metodus
subklasėse, būtų protinga
perkelti juos kartu i
superklasės metodą.
 Galim parašyti printPage()
template metodą
superklasėje, kuris leistų
PlainTextDocument ir
HtmlTextDocument
aprūpinti savo pačių
unikalia abstrakčių metodų
realizacija, antraščių
(header/footer)spausdinimui
.
7
Pavyzdys
 TextDocument superklasė:
8
Pavyzdys
 Nauja PlainTextDocument klasė (HtmlTextDocument klasė
panaši):
 Viskas ko reikia – užrašyti tinkamą abstrakčių TextDocument
metodų realizaciją .
9
Klasių diagrama
10
Dalyviai
 AbstractClass (Application):


Apibrėžia primytyvias abstrakčias operacijas, kuriose
konkrečios subklasės realizuoja algoritmo žingsnius;
Realizuoja template metodą, apibrėžiantį algoritmo
karkasą.Template medodas primityvias operacijas, taip pat ir
operacijas, apibrėžtas AbstractClass klasėje ar kituose
objektuose.
 ConcreteClass (MyApplication):

Realizuoja primityvias operacijas, vykdančias subklasėms
specifinius algoritmo žingsnius.
11
Kada naudoti Template Method?
 Realizuoti pastovias algoritmo dalis vieną kartą ir
palikti subklasėms realizuoti besikeičiančią
elgseną.
 Nustatyti bendrą subklasių elgseną ir patalpinti ją
bendroje klasėje (superklasėje), taip išvengiant
kodo dubliavimo.
 Kontroliuoti kaip subklasės praplečia superklasės
operacijas. Galima apibrėžti template metodą, kuris
iškviečia „hook“ operacijas specifiniuose taškuose,
tokiu būdu leidžiant praplėtimus tik tuose taškuose.
12
Realizavimo aspektai
 Operacijos, kurios turi būti override‘intos subklasėje, turi būti




abstract.
Jei pats template metodas neturi būti override‘intas subklasėje,
jis turi būti final.
Tam, kad subklasė galėtų įterpti kodą specifiniuose algoritmo
taškuose, reikia įterpti „hook“ operacijas template metode.
 Pagal nutylėjimą šios operacijos gali nieko nedaryti.
Reikia stengtis mažinti operacijų, kurias subklasės turi
override‘inti, skaičių, kitaip template metodo naudojimas tampa
varginantis projektuotojui.
Template metode tėvo klasė kviečia subklasės operacijas, o ne
atvirkščiai. Tai atvirkštinė kontrolės struktūra, dar vadinama
„Holivudo principu“:

„neskambinkit mums, mes paskambinsim jums“.
13
Pavyzdys Nr. 1.
14
Pavyzdys
Nr.1
15
Pavyzdys Nr.2
16
Pavyzdys Nr.2
17
„Hook“ operacijos
 Superklasė nebūtinai turi būti abstrakti – tai gali būti konkreti
klasė, turinti template metodą ir kažkiek funkcionalumo.
 Tokiu atveju primityvūs metodai negali būti abstraktūs.
 Neaišku, kurie metodai turi būti everride‘inti, kurie ne.
 Konkreti bazinė klasė turi būti naudojama tik tuomet, kai yra
realizuotos „hook“ operacijos.
 Tai dažniausiai tušti metodai, iškviečiami superklasėje (nieko
neatlieka, nes yra tušti), tačiau gali būti realizuoti
subklasėse.
 Jie gali būti laikomi atskiru template metodo atveju arba
visiškai atskiru mechanizmu.
18
„Hook“ operacijos
19
„Hook“ operacijos
 Lengva pamiršti iškviesti super klasę ir tai verčia kūrėją tikrinti
egzistuojantį superklasės metodo kodą.
20
„Hook“ operacijos
 Jei daugeliui subklasių reikia tai atlikti, reikia pridėti „hook“ operaciją:
 Tokiu būdu tereikia subklasėse aprašyti hook() metodo elgseną.
21
Susiję šablonai
 Factory metodai yra dažnai iškviečiami
Template metodų.
 Strategy: Template metodai naudoja
paveldimumą, algoritmo dalių keitimui.
Strategy naudoja perkėlimą (delegation), viso
algoritmo pakeitimui.
22
Strategy
(Behavioral)
23
Strategy
 Apibrėžiama algoritmų šeima, kiekvienas jų
enkapsuliuojamas ir padaro juos
pakeičiamais.
 Strategy leidžia varijuoti algoritmais
nepriklausomai nuo kliento.

Define a family of algorithms, encapsulate each one, and make them
interchangeable. Strategy lets the algorithm vary independently from clients that
use it.
24
Realaus pasaulio pavyzdys
25
Motyvacija
 Dažnai klasės skiriasi tik savo elgesiu.
 Tokiu atveju yra naudinga izoliuoti algoritmus
atskirose klasėse.
 Tokiu būdu turime galimybę parinkti skirtingus
algoritmus programos vykdymo metu.
26
Pavyzdys
 Egzsistuoja daug algoritmų, skirtų padalinti teksto srautą į
eilutes.
 Patalpinti šiuos algoritmus į klases, kurios jų reikalauja, nėra
pageidautina dėl kelių priežasčių:
 Klientai, kuriems reikia teksto eilučių tampa sudėtingesni, jei
juose įtrauktas dalinimo į eilutes kodas. Nuo to klientai
tampa didesni ir sunkiau palaikomi, ypač jei palaiko daug
tokių algoritmų.
 Skirtingi algoritmai bus tinkami skirtingais momentais –
nenorime palaikyti daug algoritmų, jei jų iš vis nenaudojame.
 Sunku pridėti naujus algoritmus ir keisti egzistuojančius,
kuomet dalinimas į eilutes yra neatsiejama kliento dalis.
27
Pavyzdys
 Šių problemų galima išvengti apibrėžiant
skirtingas klases, kurios enkapsuliuoja
skirtingus algoritmus. Tokiu būdu
enkapsuliuotas algoritmas vadinamas
strategija.
28
Pavyzdys
 Composition klasė yra atsakinga už teksto dalinimo į
eilutes palaikymą ir atnaujinimą. Linebreaking
strategijos nėra realizuotos klasėje Composition.
 Jos realizuotos abstrakčios Compositor klasės
subklasėse atskirai.
29
Pavyzdys
 Compositor subklasės realizuoja skirtingas
strategijas:



SimpleCompositor – paprasta strategija, kuri
apibrėžia linebreaks po vieną.
TextCompositor – realizuoja TeX algoritmą,
linebreaks suradimui. Ši strategija siekia
optimizuoti linebreaks globaliai, po paragrafą.
ArrayCompositor – atrenka breaks taip, kad
kiekviena eilutė turi fiksuotą skaičių item‘ų.
30
Pavyzdys
 Composition laiko nuorodą į Compositor
objektą.
 Visada, kuomet Compositor reformatuoja
savo tekstą, jis persiunčia atsakomybę
Compositor objektui.
 Composition klientas, įdiegdamas reikiamą
Compositor į Composition, nurodo, kuris
Compositor turi būti naudojamas.
31
Klasių diagrama
32
Dalyviai
– apibrėžia interfeisą, bendrą
visiems palaikomiems algoritmams.
 Context naudoja šį interfeisą algoritmų, apibrėžtų
ConcreteStrategy, iškvietimui.
 ConcreteStrategy (SimpleCompositor,..) – realizuoja
algoritmus, naudojant Strategy interfeisą.
 Context (Composition) :
 Konfigūruojamas ConcreteStrategy objektu.
 Laiko nuorodą į Strategy objektą.
 Gali apibrėžti interfeisą, kuris leidžia Strategy
prieiti prie jo duomenų.
 Strategy
(Compositor)
33
Kada naudoti Strategy?
 Kai daug susijusių klasių skiriasi tik savo elgesiu.
 Strategy suteikia būdą konfigūruoti klasę vienos iš
daugelio elgsenų pagalba.
 Reikia skirtingų algoritmo variantų.
 Algoritmas naudoja duomenis, apie kuriuos klientas
neturėtų žinoti.

Kada reikia išvengti sudėtingos, specifinės algoritmui
duomenų struktūros parodymo (exposing).
 Klasė apibrėžia daug elgsenų ir jos yra išreikštos
daugeliu sąlygos sakiniu.

Vietoj daug sąlygų, reikia perkelti atitinkamas sąlygų
šakas į jų nuosavą Strategy klasę.
34
Pasekmės (+)
 Families of related algorithms. Strategy klasių hierarchijos apibrėžia
algoritmų ar elgsenų šeimas, kurias naudoja kontekstas.
 Paveldėjimas gali padėti išskaidyti bendrą algoritmų funkcionalumą.
 An alternative to subclassing. Algoritmų enkapsuliavimas skirtingose
Strategy klasėse leidžia keisti algoritmus nepriklausomai nuo jo
konteksto, tokiu būdu jį lengviau pakeisti, suprasti ir praplėsti.
 Strategies eliminate conditional statements. Šablonas suteikia
alternatyvą elgesio parinkimui sąlygos sakiniais.


Kuomet skirtingos elgsenos susiplaka vienoje klasėje, sunku išvengti
sąlygos sakinų skirtingo elgesio parinkimui.
Elgesio enkapsuliavimas skirtingose Strategy klasėse eliminuoja šiuos
sąlygos sakinius.
 A choice of implementations. Strategijos gali suteikti skirtingą tokio
pačio elgesio realizaciją.
35
Pasekmės (-)
 Clients must be aware of different Strategies.
Klientas turi suprasti, kaip skiriasi strategijos, prieš
parinkdamas tinkamą.
 Klientas gali būti neapsaugotas nuo realizacijos
problemų, todėl šabloną reikėtų naudoti tik tuomet,
kuomet elgsenos variacijos svarbios klientams.
 Increased number of objects. Strategijos padidina
objektų skaičių programoje.
36
Pavyzdys
37
Pavyzdys
38
Pavyzdys
39
Pavyzdys
40
Susiję šablonai
 Flyweight: Strategy objects often make good
flyweights.
41
Pabaiga
42
Bendradarbiavimas
 Strategy and Context interact to implement the chosen algorithm. A
context may pass all data required by the algorithm to the strategy
when the algorithm is called. Alternatively, the context can pass itself as
an argument to Strategy operations. That lets the strategy call back on
the context as required.
 A context forwards requests from its clients to its strategy. Clients
usually create and pass a ConcreteStrategy object to the context;
thereafter, clients interact with the context exclusively. There is often a
family of ConcreteStrategy classes for a client to choosef rom.
43