Download
composite n.
Skip this Video
Loading SlideShow in 5 Seconds..
Composite PowerPoint Presentation

Composite

99 Vues Download Presentation
Télécharger la présentation

Composite

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

  1. Composite Autor: Milan Šafárik

  2. Úvod • Tento vzor patrí do skupiny StructuralPatterns. • Composite je objekt, ktorý obsahuje kolekciu iných objektov. • Zostavuje objekty do stromovej štruktúry, pričom umožňuje klientovi pracovať s jednoduchými i so zloženými objektmi rovnakým spôsobom.

  3. Konkrétny príklad • Majme grafický editor. K dispozícii máme jednoduché komponenty ako Text a Line. Tieto komponenty sa môžu zoskupovať do zložených komponentov, ktoré fungujú ako kontajnery. • Problémom je, že kód zaobchádza inak s primitívnymi objektmi a inak s kontajnermi, aj keď užívateľ s nimi väčšinou zaobchádza rovnako. Odlišovanie týchto komponentov robí aplikáciu komplikovanejšou.

  4. Konkrétny príklad • Compositevzor popisuje, ako použiť rekurzívnu kompozíciu, aby klient nemusel rozlišovať tieto typy tried. • Kľúčomtohto vzoru je abstraktná trieda (Graphic), ktorá reprezentuje aj jednoduché objekty aj ich kontajnery. Deklaruje operácie, ktoré sú špecifické pre grafické objekty a aj operácie pre prístup a prácu s potomkami.

  5. Konkrétny príklad • Podtriedy Line, Text a Rectangle implementujú draw na kreslenie čiar, textu a obdĺžnika. • Trieda Picture definuje kompozíciu grafických objektov. Picture implementujedrawzavolanímdraw jej potomkov. Vzhľadom k tomu, že picture rozhranie zodpovedá graphic rozhraniu, Picture objekty môžu skladať ďalšie picture objekty rekurzívne.

  6. Diagram Riešenia

  7. Uplatnenie • Ak chceme reprezentovať časť-celok (part-whole) hierarchiu objektov . • Ak chceme pracovať so všetkými objektmi v štruktúre jednotne a ignorovať rozdiely medzi primitívnymi objektmi a kompozíciami.

  8. Štruktúra

  9. Štruktúra Typická Composite objekt štruktúra môže vyzerať napríklad takto:

  10. Účastníci Component • Definuje rozhranie pre objekty v kompozícii. • Implementuje defaultné správanie spoločného rozhrania. • Deklaruje rozhranie pre prístup a správu jeho potomkov. • (Voliteľné) Definuje rozhranie pre prístup ku rodičovi v rekurzívnej štruktúre.

  11. Účastníci • Leaf • Reprezentuje listové objekty. Nemá žiadnych potomkov. • Definuje správanie pre primitívne objekty. • Composite • Definuje správanie pre komponenty, ktoré majú potomkov. • Uchováva referencie na svojich potomkov . • Implementuje metódy pre prácu s potomkami definované v Componentrozhraní.

  12. Spolupráca Klienti využívajú rozhranie triedy Component pre prácu s objektmi. Listy väčšinou vykonávajú požiadavku priamo. Ak dostane požiadavku Composite, potom ju zvyčajne prepošle potomkom, prípadne vykoná dodatočné operácie pred a po odovzdaní.

  13. Následky • Definuje hierarchiu tried pozostávajúcu z primitívnych objektov a kompozícií. Primitívne objekty môžu byť zložené do kompozícií, a tak ďalej rekurzívne. • Klientovi uľahčuje prácu s objektmi. Klient môže zaobchádzať so zloženými a primitívnymi objektmi rovnako. Väčšinou nevie a nemal by sa starať o to, či pracuje s listom alebo zloženým objektom.

  14. Následky • Uľahčuje pridávanie nových druhov komponentov. Novo definované Composite alebo Leaf podtriedy budú automaticky spolupracovať s existujúcimi štruktúrami a klientskym kódom. • Môže spraviť design príliš všeobecný. Je ťažšie obmedziť komponenty v kompozícii. Niekedy chceme mať kompozíciu len z vybraných komponent. Potrebné je použiť nejaké runtime kontroly.

  15. Využitie Composite je často využívaný napríklad pri vytváraní užívateľského rozhrania. Komponenty a kontajnery na komponenty.

  16. Ukážkový kód /** "Component" */ interface Graphic { public void print(); } /** "Leaf" */ classEllipseimplementsGraphic { publicvoidprint() { System.out.println("Ellipse"); } }

  17. Ukážkový kód /** "Composite" */ class CompositeGraphic implements Graphic { private List<Graphic> childGraphics = new ArrayList<Graphic>(); public void print() { for (Graphic graphic : childGraphics) { graphic.print(); } } public void add(Graphic graphic) { childGraphics.add(graphic); } public void remove(Graphic graphic) { childGraphics.remove(graphic); } }

  18. Ukážkový kód /** Client */ public class Program { public static void main(String[] args) { Ellipse ellipse1 = new Ellipse(); Ellipse ellipse2 = new Ellipse(); Ellipse ellipse3 = new Ellipse(); Ellipse ellipse4 = new Ellipse(); CompositeGraphic graphic = new CompositeGraphic(); CompositeGraphic graphic1 = new CompositeGraphic(); graphic1.add(ellipse1); graphic1.add(ellipse2); graphic1.add(ellipse3); graphic.add(graphic1); graphic.print(); } }}

  19. Ďakujem za pozornosť