Kompozitni dizajn uzorka u Javi
1. Uvod
U ovom brzom vodiču predstavit ćemo složeni obrazac dizajna u Javi.
Opisat ćemo strukturu i svrhu njezine uporabe.
2. Struktura
Sastavljeni uzorak treba omogućiti tretiranje pojedinačnih predmeta i kompozicija predmeta ili „kompozita“ na isti način.
Može se promatrati kao struktura stabla koja se sastoji od tipova koji nasljeđuju osnovni tip, a može predstavljati jedan dio ili cijelu hijerarhiju objekata.
Uzorak možemo podijeliti na:
- komponenta - osnovno je sučelje za sve objekte u kompoziciji. To bi trebalo biti sučelje ili apstraktna klasa s uobičajenim metodama za upravljanje dječjim kompozitima.
- leaf - provodi zadano ponašanje osnovne komponente. Ne sadrži referencu na ostale objekte.
- kompozit - ima elemente lista. Primjenjuje metode osnovnih komponenata i definira operacije povezane s djetetom.
- klijent - ima pristup elementima kompozicije pomoću objekta osnovne komponente.
3. Praktični primjer
Sada, krenimo u provedbu. Pretpostavimo želimo izgraditi hijerarhijsku strukturu odjela u tvrtki.
3.1. Osnovna komponenta
Kao objekt komponente definirat ćemo jednostavan Odjel sučelje:
odjel javnog sučelja {void printDepartmentName (); }
3.2. Listovi
Za komponente lišća definirajmo klase za financijske i prodajne odjele:
javna klasa FinancialDepartment provodi odjel {private Integer id; privatni naziv niza; javna praznina printDepartmentName () {System.out.println (getClass (). getSimpleName ()); } // standardni konstruktor, getteri, postavljači}
Druga klasa lista, Odjel prodaje, je sličan:
javna klasa SalesDepartment implementira Department {private Integer id; privatni naziv niza; javna praznina printDepartmentName () {System.out.println (getClass (). getSimpleName ()); } // standardni konstruktor, getteri, postavljači}
Obje klase provode printDepartmentName () metodu iz osnovne komponente, gdje ispisuju nazive klasa za svaku od njih.
Također, kako su klase listova, ne sadrže druge Odjel predmeta.
Dalje, pogledajmo i složenu klasu.
3.3. Kompozitni element
Kao kompozitna klasa, stvorimo Glavni odjel razred:
javna klasa HeadDepartment provodi odjel {private Integer id; privatni naziv niza; privatni popis childDepartments; javni HeadDepartment (Integer id, String name) {this.id = id; this.name = ime; this.childDepartments = novi ArrayList (); } javna praznina printDepartmentName () {childDepartments.forEach (Department :: printDepartmentName); } javni void addDepartment (odjel odjela) {childDepartments.add (odjel); } javna praznina removeDepartment (odjel odjela) {childDepartments.remove (odjel); }}
Ovo je kompozitna klasa jer sadrži zbirku Odjel komponente, kao i metode za dodavanje i uklanjanje elemenata s popisa.
Kompozit printDepartmentName () metoda provodi se prevlačenjem popisa elemenata lista i pozivanjem odgovarajuće metode za svaki od njih.
4. Ispitivanje
Za potrebe testiranja, pogledajmo a CompositeDemo razred:
javna klasa CompositeDemo {public static void main (String args []) {Department salesDepartment = new SalesDepartment (1, "Sales department"); Odjel financialDepartment = novi odjel FinancialDepartment (2, "Financijski odjel"); HeadDepartment headDepartment = novo HeadDepartment (3, "Head department"); headDepartment.addDepartment (salesDepartment); headDepartment.addDepartment (financialDepartment); headDepartment.printDepartmentName (); }}
Prvo stvorimo dvije instance za financijske i prodajne odjele. Nakon toga instanciramo šef odjela i u njega saberemo prethodno stvorene instance.
Konačno, možemo testirati printDepartmentName () metoda sastava. Kao što i očekujemo, izlaz sadrži nazive klasa svake komponente lišća:
SalesDepartment FinancialDepartment
5. Zaključak
U ovom smo članku saznali o uzorku kompozitnog dizajna. Tekst ističe glavnu strukturu i demonstrira upotrebu kroz praktični primjer.
Kao i obično, cjeloviti kôd dostupan je u projektu Github.