Kaltaisesi lukijat auttavat tukemaan MUO: ta. Kun teet ostoksen käyttämällä sivustollamme olevia linkkejä, voimme ansaita kumppanipalkkion. Lue lisää.

Yksi ohjelmistokehityksen tärkeimmistä periaatteista on avoin-suljettu suunnitteluperiaate. Tämä suunnitteluperiaate korostaa, että luokkien tulee olla avoimia laajentamista varten, mutta suljettuja muokkausta varten. Sisustajan suunnittelukuvio ilmentää avoin-kiinni -suunnitteluperiaatetta.

Sisustajan suunnittelumallin avulla voit helposti laajentaa luokkaa antamalla sille uutta käyttäytymistä muuttamatta sen olemassa olevaa koodia. Sisustuskuvio tekee tämän dynaamisesti ajon aikana sommittelun avulla. Tämä suunnittelumalli tunnetaan joustavana vaihtoehtona perinnön käytölle käyttäytymisen laajentamiseksi.

Kuinka sisustajan suunnittelukuvio toimii?

Vaikka sisustuskuvio onkin vaihtoehto luokan perintöä, sen suunnittelussa on mukana joitakin periytymisen näkökohtia. Keskeinen piirre sisustajakuviossa on, että kaikki sen luokat liittyvät toisiinsa joko suoraan tai epäsuorasti.

instagram viewer

Tyypillisellä sisustajan suunnittelukuviolla on seuraava rakenne:

Yllä olevasta luokkakaaviosta näet, että sisustajakuviossa on neljä pääluokkaa.

Komponentti: tämä on abstrakti luokka (tai rajapinta), joka toimii sisustajan kuvion supertyyppinä.

Betonikomponentti: Nämä ovat esineitä, joita voit koristella erilaisilla käytöksillä suorituksen aikana. Ne perivät komponenttirajapinnalta ja toteuttavat sen abstrakteja toimintoja.

Sisustusarkkitehti: tämä luokka on abstrakti ja sillä on sama supertyyppi kuin esineellä, jota se koristaa. Luokkakaaviossa näet kaksi suhdetta komponentti- ja sisustusluokkien välillä. Ensimmäinen suhde on perinnöllinen suhde; jokainen sisustaja on komponentti. Toinen suhde on koostumus; jokainen sisustaja on a (tai kääri a) komponentin.

Betonin sisustaja: nämä ovat yksittäisiä sisustajia, jotka antavat komponentille tietyn käyttäytymisen. Huomaa, että jokaisella betonisuunnittelijalla on esiintymämuuttuja, joka sisältää viittauksen komponenttiin.

Decorator Design Patternin käyttöönotto Javassa

Esimerkki pizzan tilaussovelluksesta voi osoittaa riittävästi, kuinka sisustuskuviota käytetään sovellusten kehittämiseen. Tämän pizzanäytesovelluksen avulla asiakkaat voivat tilata pizzoja useilla täytteillä. Sisustuskuvion ensimmäinen luokka on pizzakäyttöliittymä:

julkinenkäyttöliittymäPizza{
julkinenabstrakti merkkijono kuvaus();
julkinenabstraktikaksinkertainenkustannus();
}

Pizza-käyttöliittymä on komponenttiluokka. Joten voit luoda siitä yhden tai useamman konkreettisen luokan. Pizzayritys valmistaa kahta päätyyppiä pizzaa niiden taikinan perusteella. Yhdessä pizzatyypissä on hiivataikina:

julkinenluokkaaYeastCrustPizzatoteuttaaPizza{
@Ohittaa
julkinen merkkijono kuvaus(){
palata"Hiivalla tehty pizzataikina";
}

@Ohittaa
julkinenkaksinkertainenkustannus(){
palata18.00;
}
}

YeastCrustPizza on ensimmäinen betoni Java luokka Pizzan käyttöliittymästä. Toinen saatavilla oleva pizzatyyppi on litteäleipä:

julkinenluokkaaFlatbreadCrustPizzatoteuttaaPizza{
@Ohittaa
julkinen merkkijono kuvaus(){
palata"Leivästä valmistettu pizzataikina";
}

@Ohittaa
julkinenkaksinkertainenkustannus(){
palata15.00;
}
}

FlatbreadCrustPizza-luokka on toinen betonikomponentti ja se toteuttaa YeastCrustPizza-luokan tavoin kaikki Pizza-rajapinnan abstraktit toiminnot.

Sisustajat

Sisustusluokka on aina abstrakti, joten siitä ei voi luoda uutta ilmentymää suoraan. Mutta on välttämätöntä luoda suhde eri sisustajien ja niiden sisustamien komponenttien välille.

julkinenabstraktiluokkaaTopping DecoratortoteuttaaPizza{
julkinen merkkijono kuvaus(){
palata"Tuntematon täyte";
}
}

ToppingDecorator-luokka edustaa sisustajaluokkaa tässä esimerkkisovelluksessa. Nyt pizzayritys voi luoda monia erilaisia ​​täytteitä (tai koristeita) ToppingDecorator-luokan avulla. Oletetaan, että pizzassa voi olla kolme erilaista täytettä, nimittäin juustoa, pepperonia ja sieniä.

Juustotäyte

julkinenluokkaaJuustoulottuuTopping Decorator{
yksityinen Pizza pizza;

julkinenJuusto(Pizza pizza){
Tämä.pizza = pizza;
}

@Ohittaa
julkinen merkkijono kuvaus(){
palata pizza.description() + ", Juustotäyte";
}

@Ohittaa
julkinenkaksinkertainenkustannus(){
palatapizza.kustannus() + 2.50;
}
}

Pepperoni täyte

julkinenluokkaaPepperoniulottuuTopping Decorator{
yksityinen Pizza pizza;

julkinenPepperoni(Pizza pizza){
Tämä.pizza = pizza;
}

@Ohittaa
julkinen merkkijono kuvaus(){
palata pizza.description() + ", Pepperoni Topping";
}

@Ohittaa
julkinenkaksinkertainenkustannus(){
palatapizza.kustannus() + 3.50;
}
}

Sienen täyte

julkinenluokkaaSieniulottuuTopping Decorator{
yksityinen Pizza pizza;

julkinenSieni(Pizza pizza){
Tämä.pizza = pizza;
}

@Ohittaa
julkinen merkkijono kuvaus(){
palata pizza.description() + ", Sienipeite";
}

@Ohittaa
julkinenkaksinkertainenkustannus(){
palatapizza.kustannus() + 4.50;
}
}

Nyt sinulla on yksinkertainen sovellus, joka on toteutettu sisustajan suunnittelukuviolla. Jos asiakas tilaa hiivakuoripizzan juustolla ja pepperonilla, tämän skenaarion testikoodi näyttää seuraavalta:

julkinenluokkaaMain{
julkinenstaattinenmitätönpää(merkkijono[] args){
Pizza pizza1 = Uusi YeastCrustPizza();
pizza1 = Uusi Pepperoni (pizza1);
pizza1 = Uusi Juusto (pizza1);
System.out.println (pizza1.description() + " $" + pizza1.hinta());
}
}

Tämän koodin suorittaminen tuottaa seuraavan tulosteen konsolissa:

Kuten näet, tulos ilmoittaa pizzan tyypin ja sen kokonaiskustannukset. Pizza aloitti hiivapohjaisena pizzana hintaan 18,00 dollaria, mutta koristekuvion avulla sovellus pystyi lisäämään pizzaan uusia ominaisuuksia ja niiden sopivan hinnan. Siten pizzalle annetaan uusi käyttäytyminen muuttamatta olemassa olevaa koodia (hiivakuoripizza).

Sisustuskuviolla voit myös soveltaa samaa käyttäytymistä esineeseen niin monta kertaa kuin haluat. Jos asiakas tilaa pizzan, jossa on kaikki päällä, ja ylimääräistä juustoa, voit päivittää pääluokan seuraavalla koodilla vastaamaan tätä:

Pizza pizza 2 = Uusi YeastCrustPizza();
pizza2 = Uusi Pepperoni (pizza2);
pizza2 = Uusi Juusto (pizza2);
pizza2 = Uusi Juusto (pizza2);
pizza2 = Uusi Sieni (pizza2);

System.out.println (pizza2.description() + " $" + pizza2.kustannus());

Päivitetty sovellus tuottaa seuraavan tulosteen konsolissa:

Decorator Design Patternin käytön edut

Sisustussuunnittelukuvion käytön kaksi suurta etua ovat turvallisuus ja joustavuus. Sisustuskuvion avulla voit kehittää turvallisempaa koodia olematta häiritsemättä olemassa olevaa suojattua koodia. Sen sijaan se laajentaa olemassa olevaa koodia koostumuksen kautta. Estää tehokkaasti uusien bugien tai tahattomien sivuvaikutusten syntymisen.

Koostumuksesta johtuen kehittimellä on myös paljon joustavuutta koristekuvion käytössä. Voit ottaa käyttöön uuden sisustajan milloin tahansa lisätäksesi uutta toimintaa muuttamatta olemassa olevaa koodia ja häiritsemättä sovellusta.