Tādi lasītāji kā jūs palīdz atbalstīt MUO. Veicot pirkumu, izmantojot saites mūsu vietnē, mēs varam nopelnīt filiāles komisiju. Lasīt vairāk.

Viens no svarīgākajiem principiem programmatūras izstrādē ir atvērtā un slēgtā dizaina princips. Šis projektēšanas princips uzsver, ka klasēm jābūt atvērtām paplašināšanai, bet slēgtām modificēšanai. Dekoratora dizaina modelis iemieso atvērtā-slēgtā dizaina principu.

Izmantojot dekoratora dizaina modeli, varat viegli paplašināt klasi, piešķirot tai jaunu darbību, nemainot esošo kodu. Dekoratora modelis to veic dinamiski izpildlaikā, izmantojot kompozīciju. Šis dizaina modelis ir pazīstams kā elastīga alternatīva mantojuma izmantošanai, lai paplašinātu uzvedību.

Kā darbojas dekoratora dizaina modelis?

Lai gan dekoratora raksts ir alternatīva klases mantojums, tā dizainā ir iekļauti daži mantojuma aspekti. Galvenais dekoratora modeļa aspekts ir tas, ka visas tā klases ir tieši vai netieši saistītas.

Tipiskam dekoratora dizaina modelim ir šāda struktūra:

Iepriekš redzamajā klašu diagrammā var redzēt, ka dekoratora modelim ir četras galvenās klases.

Komponents: šī ir abstrakta klase (vai interfeiss), kas kalpo kā dekoratora modeļa supertips.

Betona komponents: šie ir objekti, kurus izpildlaikā varat izrotāt ar dažādām darbībām. Viņi manto no komponentu saskarnes un īsteno tā abstraktās funkcijas.

Dekorators: šī klase ir abstrakta, un tai ir tāds pats supertips kā objektam, ko tā dekorēs. Klases diagrammā redzēsit divas attiecības starp komponentu un dekoratoru klasēm. Pirmās attiecības ir mantojuma attiecības; katrs dekorators ir komponents. Otrās attiecības ir kompozīcijas attiecības; katrs dekorators ir (vai aptin a) komponentu.

Betona dekorētājs: tie ir individuālie dekoratori, kas komponentam piešķir īpašu uzvedību. Jāņem vērā, ka katram betona dekoratoram ir gadījuma mainīgais, kurā ir atsauce uz komponentu.

Dekoratora dizaina modeļa ieviešana Java

Picas pasūtīšanas lietojumprogrammas paraugs var adekvāti parādīt, kā izmantot dekoratora modeli lietojumprogrammu izstrādei. Šī picas lietojumprogrammas paraugs ļauj klientiem pasūtīt picas ar vairākiem pildījumiem. Pirmā dekoratora modeļa klase ir picas saskarne:

publiskisaskarnepica{
publiskiabstrakts Stīga apraksts();
publiskiabstraktsdubultāizmaksas();
}

Picas saskarne ir komponentu klase. Tātad no tā varat izveidot vienu vai vairākas konkrētas klases. Picu uzņēmums ražo divus galvenos picu veidus, pamatojoties uz to mīklu. Viena veida picām ir rauga mīkla:

publiskiklasēYeastCrustPizzaīstenopica{
@Override
publiski Stīga apraksts(){
atgriezties"Picas mīkla, kas pagatavota ar raugu";
}

@Override
publiskidubultāizmaksas(){
atgriezties18.00;
}
}

YeastCrustPizza ir pirmais betons Java klase no Pica saskarnes. Otrs pieejamais picas veids ir plātsmaize:

publiskiklasēFlatbreadCrustPizzaīstenopica{
@Override
publiski Stīga apraksts(){
atgriezties"Picas mīkla, kas pagatavota ar plātsmaizi";
}

@Override
publiskidubultāizmaksas(){
atgriezties15.00;
}
}

FlatbreadCrustPizza klase ir otrā betona sastāvdaļa, un, tāpat kā YeastCrustPizza klase, tā īsteno visas Pizza interfeisa abstraktās funkcijas.

Dekoratori

Dekoratoru klase vienmēr ir abstrakta, tāpēc jūs nevarat izveidot jaunu instanci tieši no tās. Bet ir nepieciešams izveidot attiecības starp dažādiem dekoratoriem un sastāvdaļām, kuras viņi dekorēs.

publiskiabstraktsklasēToppingDekoratorsīstenopica{
publiski Stīga apraksts(){
atgriezties"Nezināms papildinājums";
}
}

Klase ToppingDecorator apzīmē dekoratoru klasi šajā lietojumprogrammas paraugā. Tagad picu uzņēmums var izveidot daudz dažādu piedevu (vai dekorētāju), izmantojot ToppingDecorator klasi. Pieņemsim, ka picai var būt trīs dažādu veidu piedevas, proti, siers, peperoni un sēnes.

Siera pildījums

publiskiklasēSierspagarinaToppingDekorators{
Privāts Picas pica;

publiskiSiers(picas pica){
šis.pica = pica;
}

@Override
publiski Stīga apraksts(){
atgriezties pica.description() + ", Siera pildījums";
}

@Override
publiskidubultāizmaksas(){
atgrieztiespica.izmaksas() + 2.50;
}
}

Pepperoni pildījums

publiskiklasēPepperonipagarinaToppingDekorators{
Privāts Picas pica;

publiskiPepperoni(picas pica){
šis.pica = pica;
}

@Override
publiski Stīga apraksts(){
atgriezties pica.description() + ", piparu virskārta";
}

@Override
publiskidubultāizmaksas(){
atgrieztiespica.izmaksas() + 3.50;
}
}

Sēņu pildījums

publiskiklasēSēnepagarinaToppingDekorators{
Privāts Picas pica;

publiskiSēne(picas pica){
šis.pica = pica;
}

@Override
publiski Stīga apraksts(){
atgriezties pica.description() + ", sēņu pildījums";
}

@Override
publiskidubultāizmaksas(){
atgrieztiespica.izmaksas() + 4.50;
}
}

Tagad jums ir vienkārša lietojumprogramma, kas ieviesta, izmantojot dekoratora dizaina modeli. Ja klients pasūta rauga garozas picu ar sieru un pepperoni, šī scenārija testa kods izskatīsies šādi:

publiskiklasēGalvenā{
publiskistatisksnederīgsgalvenais(String[] args){
Picas pica1 = jauns YeastCrustPizza();
pica1 = jauns Pepperoni (pica1);
pica1 = jauns Siers (pica1);
System.out.println (pica1.description() + " $" + pica1.maksa());
}
}

Palaižot šo kodu, konsolē tiks parādīta šāda izvade:

Kā redzat, izlaidē ir norādīts picas veids un tās kopējās izmaksas. Pica sākās kā pica ar rauga garozu par 18,00 ASV dolāriem, taču, izmantojot dekorēšanas modeli, lietojumprogramma varēja pievienot picai jaunas funkcijas un to atbilstošās izmaksas. Tādējādi picai piešķirot jaunu darbību, nemainot esošo kodu (pica ar rauga garozu).

Izmantojot dekoratora modeli, varat arī piemērot to pašu uzvedību objektam tik reižu, cik vēlaties. Ja klients pasūta picu, uz kuras ir viss uzrakstīts, un papildu sieru, varat atjaunināt galveno klasi ar šādu kodu, lai to atspoguļotu:

Picas pica2 = jauns YeastCrustPizza();
pica2 = jauns Pepperoni (pica2);
pica2 = jauns Siers (pica2);
pica2 = jauns Siers (pica2);
pica2 = jauns Sēne (pica2);

System.out.println (pica2.description() + " $" + pica2.maksa());

Atjauninātā lietojumprogramma konsolē radīs šādu izvadi:

Dekoratora dizaina modeļa izmantošanas priekšrocības

Divas galvenās dekoratora dizaina modeļa priekšrocības ir drošība un elastība. Dekoratora modelis ļauj izstrādāt drošāku kodu, neiejaucoties jau esošajā drošajā kodā. Tā vietā tas paplašina esošo kodu, izmantojot kompozīciju. Efektīvi novēršot jaunu kļūdu vai neparedzētu blakusparādību rašanos.

Kompozīcijas dēļ izstrādātājam ir arī liela elastība, izmantojot dekoratora rakstu. Jebkurā laikā varat ieviest jaunu dekoratoru, lai pievienotu jaunu darbību, nemainot esošo kodu un neizjaucot lietojumprogrammu.