Kompozit tervezési minta Java-ban

1. Bemutatkozás

Ebben a gyors bemutatóban bemutatjuk az összetett tervezési mintát Java-ban.

Leírjuk a szerkezetét és használatának célját.

2. A szerkezet

Az összetett minta célja, hogy lehetővé tegye az egyes tárgyak és tárgyi összetételek, vagy „kompozitok” azonos kezelését.

Fakonstrukciónak tekinthető, amely olyan típusokból áll, amelyek örökölnek egy alaptípust, és az objektumok egyetlen részét vagy egész hierarchiáját képviselheti.

Bonthatjuk a mintát:

  • komponens - a kompozíció összes objektumának alap interfésze. Vagy interfésznek, vagy absztrakt osztálynak kell lennie a gyermek kompozitok kezelésének általános módszereivel.
  • levél - végrehajtja az alapkomponens alapértelmezett viselkedését. Nem tartalmaz hivatkozást a többi objektumra.
  • kompozit - levélelemekkel rendelkezik. Megvalósítja az alapkomponens módszereket és meghatározza a gyermekekkel kapcsolatos műveleteket.
  • kliens - hozzáférhet a kompozíciós elemekhez az alapkomponens objektum használatával.

3. Gyakorlati példa

Most merüljünk el a megvalósításban. Tegyük fel a részlegek hierarchikus felépítését szeretnénk felépíteni egy vállalatban.

3.1. Az alapkomponens

Komponens objektumként meghatározunk egy egyszerűt Osztály felület:

nyilvános felület Osztály {void printDepartmentName (); }

3.2. levelek

A levélkomponenseknél határozzuk meg a pénzügyi és értékesítési osztályok osztályait:

public class FinancialDepartment végrehajtja a Department {private Integer id; privát karakterlánc neve; public void printDepartmentName () {System.out.println (getClass (). getSimpleName ()); } // szabványos kivitelező, mérőeszközök, beállítók}

A második levélosztály, Értékesítési osztály, hasonló:

public class SalesDepartment végrehajtja a Department {private Integer id; privát karakterlánc neve; public void printDepartmentName () {System.out.println (getClass (). getSimpleName ()); } // szabványos kivitelező, mérőeszközök, beállítók}

Mindkét osztály megvalósítja a printDepartmentName () metódust az alapkomponensből, ahol mindegyiknek kinyomtatják az osztályneveket.

Továbbá, mivel levélosztályok, nem tartalmaznak másokat Osztály tárgyakat.

Ezután lássunk egy összetett osztályt is.

3.3. Az összetett elem

Összetett osztályként hozzuk létre a HeadDepartment osztály:

public class HeadDepartment végrehajtja a Department {private Integer id; privát karakterlánc neve; privát List childDepartments; public HeadDepartment (Integer id, String name) {this.id = id; ez.név = név; this.childDepartments = new ArrayList (); } public void printDepartmentName () {childDepartments.forEach (Department :: printDepartmentName); } public void addDepartment (Osztály osztály) {childDepartments.add (osztály); } public void removeDepartment (Department Department) {childDepartments.remove (osztály); }}

Ez egy összetett osztály, mivel gyűjteménye van Osztály alkatrészek, valamint az elemek hozzáadásának és eltávolításának módszerei a listáról.

Az összetett printDepartmentName () A metódust úgy hajtjuk végre, hogy a levélelemek listáját átismételjük, és mindegyikhez meghívjuk a megfelelő módszert.

4. Tesztelés

Tesztelés céljából vessünk egy pillantást a CompositeDemo osztály:

public class CompositeDemo {public static void main (String args []) {Department salesDepartment = new SalesDepartment (1, "Értékesítési részleg"); Department financialDepartment = új Pénzügyi osztály (2, "Pénzügyi osztály"); HeadDepartment headDepartment = új HeadDepartment (3, "Head department"); headDepartment.addDepartment (salesDepartment); headDepartment.addDepartment (pénzügyi részleg); headDepartment.printDepartmentName (); }}

Először két példányt hozunk létre a pénzügyi és az értékesítési részleg számára. Ezután példányosítjuk a főosztályt, és összeadjuk a korábban létrehozott példányokat.

Végül kipróbálhatjuk a printDepartmentName () kompozíciós módszer. Ahogy várjuk, a kimenet az egyes levélkomponensek osztályneveit tartalmazza:

SalesDepartment FinancialDepartment

5. Következtetés

Ebben a cikkben megtudtuk a Composite tervezési mintát. Az írás kiemeli a fő struktúrát, és a gyakorlati példán keresztül mutatja be a felhasználást.

Szokás szerint a teljes kód elérhető a Github projektben.