Programavimas

Pažvelkite į sudėtinio dizaino modelį

Anądien klausiausi Nacionalinio viešojo radijo Automobilių pokalbiai, populiari savaitinė transliacija, kurios metu skambinantieji užduoda klausimus apie savo transporto priemones. Prieš kiekvieną programos pertrauką laidos vedėjai paprašo skambintojų surinkti numerį 1-800-CAR-TALK, kuris atitinka 1-800-227-8255. Žinoma, pirmieji pasirodo daug lengviau įsimenami nei antrieji, iš dalies todėl, kad žodžiai „AUTO KALBĖ“ yra sudėtiniai: du žodžiai, žymintys septynis skaitmenis. Žmonėms paprastai lengviau susidoroti su kompozitais, o ne su atskirais komponentais. Panašiai, kai kuriate į objektą orientuotą programinę įrangą, dažnai patogu manipuliuoti kompozitais, kaip ir atskirais komponentais. Ta prielaida yra pagrindinis kompozicinio dizaino modelio principas, šio tema „Java“ dizaino modeliai išsimokėtinai.

Kompozicinis modelis

Prieš pasinerdami į „Composite“ modelį, pirmiausia turiu apibrėžti sudėtiniai objektai: objektai, kuriuose yra kitų objektų; pavyzdžiui, piešinys gali būti sudarytas iš grafinių primityvų, tokių kaip linijos, apskritimai, stačiakampiai, tekstas ir pan.

„Java“ kūrėjams reikalingas sudėtinis šablonas, nes mes dažnai turime manipuliuoti kompozitais lygiai taip pat, kaip ir primityviais objektais. Pavyzdžiui, grafinius primityvus, pvz., Linijas ar tekstą, reikia nupiešti, perkelti ir pakeisti jų dydį. Bet mes taip pat norime atlikti tą pačią operaciją kompozitams, pavyzdžiui, piešiniams, kurie yra sudaryti iš tų primityvų. Idealiu atveju mes norėtume atlikti veiksmus su primityviais daiktais ir kompozitais lygiai taip pat, neatskiriant jų dviejų. Jei turime atskirti primityvius objektus nuo kompozitų, kad atliktume tas pačias operacijas su šiais dviem objektų tipais, mūsų kodas taptų sudėtingesnis ir sunkiau įgyvendinamas, prižiūrimas ir išplėstas.

Į Dizaino modeliai, autoriai apibūdina sudėtinį modelį taip:

Sudarykite objektus į medžių struktūras, kad reprezentuotumėte visos dalies hierarchijas. „Composite“ leidžia klientams vienodai elgtis su atskirais daiktais ir objektų kompozicijomis.

„Composite“ modelį lengva įgyvendinti. Kompozicinės klasės pratęsia pagrindinę klasę, vaizduojančią primityvius objektus. 1 paveiksle parodyta klasės schema, iliustruojanti sudėtinio modelio struktūrą.

1 paveiksle pateiktoje klasių diagramoje naudojau klasių pavadinimus iš Dizaino raštas “s Diskusijos dėl sudėtinio modelio: Komponentas žymi primityvių objektų bazinę klasę (arba galbūt sąsają) ir Sudėtinis reiškia sudėtinę klasę. Pavyzdžiui, Komponentas klasė gali būti pagrindinė grafinių primityvų klasė, o Sudėtinis klasė gali atstovauti a Piešimas klasė. 1 paveikslas Lapas klasė reiškia konkretų primityvų daiktą; pavyzdžiui, a Linija klasė arba a Tekstas klasė. Operacija1 () ir Operation2 () metodai reiškia srities specifinius metodus, kuriuos įgyvendina abu Komponentas ir Sudėtinis klasės.

Sudėtinis klasė prižiūri komponentų kolekciją. Paprastai Sudėtinis metodai įgyvendinami kartojant tą rinkinį ir taikant kiekvienam tinkamą metodą Komponentas kolekcijoje. Pavyzdžiui, a Piešimas klasė gali ją įgyvendinti piešti () toks metodas:

// Šis metodas yra sudėtinis metodas public void draw () {// Kartokite komponentus, skirtus (int i = 0; i <getComponentCount (); ++ i) {// Gaukite nuorodą į komponentą ir iškvieskite jo piešinį metodas Komponento komponentas = getComponent (i); komponentas.piešti (); }} 

Kiekvienam programoje įdiegtam metodui Komponentas klasė Sudėtinis klasėje įgyvendinamas metodas su tuo pačiu parašu, kuris kartoja kompozito komponentus, kaip parodyta piešti () aukščiau išvardytą metodą.

Sudėtinis klasė pratęsia Komponentas klasę, taigi galite perduoti sudėtinį metodą, kuris tikisi komponento; pavyzdžiui, apsvarstykite šį metodą:

// Šis metodas įgyvendinamas klasėje, nesusijusioje su „// Component“ ir „Composite“ klasėmis public void repaint (Component component) {// Komponentas gali būti sudėtinis, tačiau kadangi jis pratęsia // Component klasę, šio metodo nereikia // atskirti komponentus nuo kompozitų komponentas.draw (); } 

Ankstesniam metodui perduodamas komponentas - paprastas arba sudėtinis -, tada jis iškviečia tą komponentą piešti () metodas. Nes Sudėtinis klasė tęsiasi Komponentas, perdažyti () metodas neturi atskirti komponentų ir kompozitų - jis tiesiog remiasi piešti () komponento (arba kompozito) metodas.

1 paveiksle pateiktoje sudėtinio modelio klasės schemoje pavaizduota viena modelio problema: nurodydami komponentą, turite atskirti komponentus nuo sudėtinių Komponentas, ir turite naudoti specifinį sudėtinį metodą, pvz addComponent (). Paprastai tą reikalavimą įvykdote pridėdami metodą, pvz isComposite (), į Komponentas klasė. Tas metodas grįžta melagingas komponentams ir yra nepaisoma Sudėtinis klasę grįžti tiesa. Be to, jūs taip pat turite mesti Komponentas nuoroda į a Sudėtinis pavyzdžiui, taip:

... if (component.isComposite ()) {Composite composite = (sudėtinis) komponentas; composite.addComponent (someComponentThatCouldBeAComposite); } ... 

Atkreipkite dėmesį, kad addComponent () metodas yra išlaikytas a Komponentas nuoroda, kuri gali būti arba primityvus komponentas, arba sudėtinis. Kadangi tas komponentas gali būti sudėtinis, galite komponuoti komponentus į medžio struktūrą, kaip nurodyta minėtoje citatoje iš Dizaino modeliai.

2 paveiksle parodytas alternatyvus sudėtinio modelio įgyvendinimas.

Jei įgyvendinsite 2 paveikslo sudėtinį modelį, jums niekada nereikės atskirti komponentų ir kompozitų ir jums nereikės mesti Komponentas nuoroda į a Sudėtinis instancija. Taigi aukščiau išvardytas kodo fragmentas sumažėja iki vienos eilutės:

... component.addComponent (someComponentThatCouldBeAComposite); ... 

Bet jei Komponentas nuoroda ankstesniame kodo fragmente nenurodo a Sudėtinis, ką turėtų addComponent () daryti? Tai yra pagrindinis ginčijamas taškas įgyvendinant 2 paveikslo „Composite“ modelį. Kadangi primityviuose komponentuose nėra kitų komponentų, komponento pridėti prie kito komponento nėra prasmės, todėl Component.addComponent () metodas gali tyliai nepavykti arba išimtis. Paprastai komponento pridėjimas prie kito primityvaus komponento laikomas klaida, todėl išimties išmetimas yra bene geriausias būdas.

Taigi, kuris sudėtinio modelio įgyvendinimas - 1 pav. Ar 2 pav. - veikia geriausiai? Tai visada yra didelių diskusijų tema tarp sudėtinio modelio diegėjų; Dizaino modeliai teikia pirmenybę 2 paveikslo įgyvendinimui, nes jums niekada nereikia atskirti komponentų ir talpyklų ir jums niekada nereikia atlikti liejimo. Asmeniškai man labiau patinka 1 paveikslo įgyvendinimas, nes aš labai nenoriu taikyti metodų klasėje, kurie neturi prasmės tam objekto tipui.

Dabar, kai suprantate sudėtinį modelį ir kaip jį įgyvendinti, panagrinėkime sudėtinio modelio pavyzdį su „Apache Struts JavaServer Pages“ (JSP) sistema.

Sudėtinis raštas ir statramsčių plytelės

„Apache Struts“ sistemoje yra JSP žymų biblioteka, vadinama plytelėmis, kuri leidžia jums sukurti tinklalapį iš kelių JSP. „Plytelės“ iš tikrųjų yra „J2EE“ („Java 2 Platform“, „Enterprise Edition“) „CompositeView“ modelio įgyvendinimas, kuris pats pagrįstas Dizaino modeliai Kompozicinis raštas. Prieš aptardami sudėtinio modelio tinkamumą žymų bibliotekai, pirmiausia apžvelkime plytelių loginį pagrindą ir kaip jūs jį naudojate. Jei jau esate susipažinę su statramsčių plytelėmis, galite praleisti tolesnius skyrius ir pradėti skaityti skyrelyje „Sudėtinio modelio naudojimas su statramsčio plytelėmis“.

Pastaba: Daugiau apie „J2EE CompositeView“ modelį galite sužinoti mano „Žiniatinklio programų komponentuose, kuriuos lengva naudoti naudojant sudėtinį rodinį“ („JavaWorld“, 2001 m. Gruodžio mėn.) Straipsnis.

Dizaineriai dažnai kuria tinklalapius su atskirų regionų rinkiniu; pavyzdžiui, 3 paveikslo tinklalapyje yra šoninė juosta, antraštė, turinio sritis ir poraštė.

Svetainėse dažnai yra keli tinklalapiai su vienodais išdėstymais, pvz., 3 paveikslo šoninės juostos / antraštės / turinio / poraštės išdėstymas. Struts plytelės leidžia pakartotinai naudoti turinį ir išdėstymą keliuose tinklalapiuose. Prieš aptardami šį pakartotinį naudojimą, pažiūrėkime, kaip 3 paveikslo maketas tradiciškai įgyvendinamas tik naudojant HTML.

Įdiekite sudėtingus išdėstymus rankomis

1 pavyzdyje parodyta, kaip galite įgyvendinti 3 paveikslo tinklalapį naudodami HTML:

1 pavyzdys. Sudėtingas išdėstymas, įgyvendinamas rankomis

    Sudėtingų maketų įgyvendinimas rankomis <% - vienoje lentelėje pateikiamas visas šio puslapio turinys -%>
Nuorodos

Namai

Produktai

Atsisiuntimai

Baltosios knygos

Susisiekite su mumis

Sveiki atvykę į „Sabreware, Inc.“
Čia pateikiamas konkretaus puslapio turinys

Ačiū, kad užsukote!

Ankstesnis JSP turi du pagrindinius trūkumus: Pirma, puslapio turinys yra įterptas į JSP, todėl negalite jo pakartotinai naudoti, nors greičiausiai šoninė juosta, antraštė ir poraštė daugelyje tinklalapių yra vienodi. Antra, puslapio maketas taip pat yra įtrauktas į tą JSP, todėl jūs taip pat negalite jo pakartotinai naudoti, nors daugelis kitų to paties tinklalapio tinklalapių naudoja tą patį išdėstymą. Mes galime naudoti veiksmai pirmajam trūkumui pašalinti, kaip aptarsiu toliau.

Įgyvendinkite sudėtingus išdėstymus naudodami JSP

2 pavyzdyje parodytas 3 paveikslo tinklalapio, kuris naudoja, įgyvendinimas :