Composite Entity Pattern

Composite Entity Pattern

vg

Composite Entity Pattern ist ein Entwurfsmuster, das verwendet wird, um die Komplexität bei der Modellierung von Geschäftsobjekten zu reduzieren. Es ermöglicht die Organisation von Entitäten in einer hierarchischen Struktur, bei der jedes Composite-Objekt aus mehreren kleineren Entitäten besteht. Dies ist besonders hilfreich in Anwendungen, die komplexe Datenstrukturen handhaben müssen.

Was ist das Composite Entity Pattern?

Das Composite Entity Pattern hilft, komplexe Objekte zu verwalten, die aus mehreren Teilen bestehen. Diese Teile können eigenständige Entitäten sein, aber zusammen bilden sie eine größere Geschäftseinheit. Das Muster ermöglicht eine einfache Verwaltung von Entitäten und reduziert die Koppelung.

In der Regel wird dieses Muster in Situationen eingesetzt, in denen eine Entität aus mehreren Sub-Entitäten besteht, die miteinander interagieren. Es hilft, die Abhängigkeiten zwischen den einzelnen Entitäten zu verwalten und vereinfacht den Zugriff auf ihre Attribute.

Hauptkomponenten des Composite Entity Patterns

  1. Composite Entity: Das Composite-Objekt besteht aus mehreren Entitäten, die zusammen eine größere Entität bilden.
  2. Leaf Entities: Dies sind die einzelnen Entitäten, die zusammen die Composite Entity ausmachen.
  3. Client: Der Client greift auf die Composite Entity zu und kann mit ihr als einem einzelnen Objekt arbeiten.
  4. Business Delegate: Der Business Delegate vermittelt zwischen der Präsentationslogik und den Business Services.

Funktionsweise des Composite Entity Patterns

Das Composite Entity Pattern arbeitet, indem es die Komplexität von Entitäten abstrahiert. Statt mit vielen Einzelobjekten zu arbeiten, wird eine Composite Entity als einzelnes Objekt behandelt. Diese Composite Entity enthält Verweise auf die einzelnen Entitäten (Sub-Entitäten), die zusammen die komplexe Entität ausmachen.

Der Zugriff auf die Entitäten erfolgt in der Regel über eine vereinfachte Schnittstelle. Die Präsentationsschicht muss sich nicht mit den Details der einzelnen Sub-Entitäten befassen. Stattdessen arbeitet sie mit der Composite Entity, die die Verwaltung und Kommunikation der Sub-Entitäten übernimmt.

Vorteile des Composite Entity Patterns

  1. Verkürzung der Komplexität: Das Muster reduziert die Komplexität, indem es mehrere Entitäten zu einer einzigen Composite Entity zusammenfasst.
  2. Erleichterung des Zugriffs: Die Präsentationsschicht muss nur mit der Composite Entity arbeiten, nicht mit jeder einzelnen Entität.
  3. Verbesserte Wartbarkeit: Änderungen an den Sub-Entitäten wirken sich nicht direkt auf die Präsentationslogik aus.
  4. Erhöhung der Flexibilität: Die Struktur der Composite Entity kann bei Bedarf geändert werden, ohne dass die Gesamtarchitektur betroffen ist.

Nachteile des Composite Entity Patterns

  1. Erhöhte Komplexität bei der Implementierung: Wenn das Pattern nicht richtig implementiert wird, kann es die Architektur unnötig komplizieren.
  2. Performance-Probleme: Da alle Sub-Entitäten geladen werden, kann dies zu Performance-Problemen führen, besonders bei großen Entitäten.
  3. Potenzielle Redundanz: Bei einfachen Anwendungen kann das Pattern unnötig sein und zusätzlichen Overhead verursachen.

Beispiel in C++

Hier zeigen wir ein einfaches Beispiel, wie das Composite Entity Pattern in C++ implementiert werden kann.

Schritt 1: Definieren der Leaf Entities

Zuerst definieren wir die einzelnen Entitäten, die zusammen die Composite Entity bilden werden.

#include <iostream>
#include <string>
#include <vector>

class LeafEntity {
public:
    virtual void display() const = 0;
};

class Address : public LeafEntity {
public:
    void display() const override {
        std::cout << "Adresse: 123 Hauptstraße, Berlin\n";
    }
};

class Name : public LeafEntity {
public:
    void display() const override {
        std::cout << "Name: Max Mustermann\n";
    }
};

class PhoneNumber : public LeafEntity {
public:
    void display() const override {
        std::cout << "Telefon: 123456789\n";
    }
};

Schritt 2: Definieren der Composite Entity

Die Composite Entity besteht aus mehreren Sub-Entitäten und kümmert sich um deren Verwaltung.

cppCode kopierenclass CompositeEntity {
private:
    std::vector<LeafEntity*> entities;

public:
    CompositeEntity() {
        entities.push_back(new Address());
        entities.push_back(new Name());
        entities.push_back(new PhoneNumber());
    }

    void display() const {
        for (const auto& entity : entities) {
            entity->display();
        }
    }

    ~CompositeEntity() {
        for (auto& entity : entities) {
            delete entity;
        }
    }
};

Schritt 3: Implementieren der Client-Klasse

Der Client verwendet die Composite Entity, um die verschiedenen Sub-Entitäten darzustellen.

class Client {
private:
    CompositeEntity* composite;

public:
    Client(CompositeEntity* composite) : composite(composite) {}

    void displayData() const {
        composite->display();
    }
};

Schritt 4: Hauptfunktion

In der Hauptfunktion erstellen wir die Composite Entity und den Client, der mit ihr arbeitet.

int main() {
    CompositeEntity* composite = new CompositeEntity();
    Client* client = new Client(composite);

    std::cout << "Daten aus der Composite Entity:\n";
    client->displayData();

    delete client;
    delete composite;

    return 0;
}

Erklärung des Beispiels

In diesem Beispiel haben wir mehrere LeafEntity-Objekte: Address, Name und PhoneNumber. Diese Objekte repräsentieren einzelne Entitäten. Die CompositeEntity fasst diese Sub-Entitäten zusammen und stellt eine einfache display()-Methode zur Verfügung, die die Daten aller Sub-Entitäten anzeigt.

Der Client greift auf die CompositeEntity zu, ohne sich mit den einzelnen Sub-Entitäten befassen zu müssen. Dies reduziert die Komplexität und sorgt dafür, dass die Präsentationsschicht nur mit einem einzigen Objekt arbeitet.

Beispiel des Composite Entity Patterns in Python

Das Composite Entity Pattern ist ein Entwurfsmuster, das verwendet wird, um komplexe Objekte zu modellieren, die aus mehreren zusammenhängenden Entitäten bestehen. Es hilft dabei, die Entitäten in einer Struktur zu organisieren, sodass sie zusammen als eine einzige Entität behandelt werden können. In Python könnte man das Composite Entity Pattern auf folgende Weise umsetzen:

Beispiel in Python:

Stellen wir uns vor, wir modellieren ein System für eine Bestellung in einem E-Commerce-Shop. Eine Bestellung könnte aus mehreren Produkten bestehen und jedes Produkt hat seine eigene Preis- und Lagerinformationen. Diese verschiedenen Informationen lassen sich durch das Composite Entity Pattern strukturieren.

Code:

# Eine Entität, die das Produkt darstellt
class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def get_details(self):
        return f"Produkt: {self.name}, Preis: {self.price}"

# Eine Entität, die die Lagerinformation darstellt
class Inventory:
    def __init__(self, stock):
        self.stock = stock

    def get_stock(self):
        return f"Lagerbestand: {self.stock}"

# Eine Composite-Entität, die mehrere Entitäten zusammenfasst
class Order:
    def __init__(self):
        self.products = []
        self.inventory = []

    def add_product(self, product):
        self.products.append(product)

    def add_inventory(self, inventory):
        self.inventory.append(inventory)

    def get_order_details(self):
        product_details = [product.get_details() for product in self.products]
        inventory_details = [inventory.get_stock() for inventory in self.inventory]
        return {
            "Produkte": product_details,
            "Lager": inventory_details
        }

# Nutzung des Composite Entity Patterns
order = Order()

# Erstellen von Produkten
product1 = Product("Laptop", 1200)
product2 = Product("Smartphone", 800)

# Erstellen von Lagerinformationen
inventory1 = Inventory(10)  # 10 Laptops auf Lager
inventory2 = Inventory(20)  # 20 Smartphones auf Lager

# Hinzufügen von Produkten und Lager zu der Bestellung
order.add_product(product1)
order.add_product(product2)
order.add_inventory(inventory1)
order.add_inventory(inventory2)

# Ausgabe der Bestelldetails
order_details = order.get_order_details()
print(order_details)

Erklärung:

  • Product: Diese Klasse repräsentiert ein Produkt, das mit einem Namen und einem Preis ausgestattet ist.
  • Inventory: Diese Klasse repräsentiert die Lagerbestände eines Produkts.
  • Order: Die Order-Klasse ist die Composite-Entität, die eine Sammlung von Product– und Inventory-Objekten enthält. Sie ermöglicht es, die verschiedenen Entitäten (Produkte und Lager) zu einer einzigen Bestellung zusammenzufassen.

Das Muster sorgt dafür, dass wir die Bestellung als eine einzelne Entität behandeln können, obwohl sie aus verschiedenen, miteinander verbundenen Entitäten besteht.

Die Ausgabe des Codes könnte wie folgt aussehen:

{
    'Produkte': ['Produkt: Laptop, Preis: 1200', 'Produkt: Smartphone, Preis: 800'],
    'Lager': ['Lagerbestand: 10', 'Lagerbestand: 20']
}

Mit diesem Ansatz wird der Umgang mit komplexen Entitäten, die aus vielen miteinander verbundenen Objekten bestehen, vereinfacht.

Anwendungsfälle des Composite Entity Patterns

Das Composite Entity Pattern eignet sich besonders für Systeme, die mit komplexen Datenstrukturen arbeiten. Beispiele umfassen:

  1. Enterprise Applications: In größeren Unternehmensanwendungen, in denen mehrere Sub-Entitäten kombiniert werden, kann das Muster verwendet werden, um die Architektur zu vereinfachen.
  2. E-Commerce-Plattformen: Wenn eine Bestellung aus mehreren Entitäten besteht, z. B. Kundeninformation, Versanddetails und Produktinformationen, kann das Composite Entity Pattern verwendet werden.
  3. Content-Management-Systeme: In einem CMS, das unterschiedliche Content-Typen verwaltet, kann dieses Muster zur Modellierung von komplexen Objekten eingesetzt werden.

Wann sollte das Composite Entity Pattern eingesetzt werden und wann nicht?

Das Composite Entity Pattern sollte in den folgenden Szenarien eingesetzt werden:

1. Komplexe Entitäten mit abhängigen Komponenten:

Wenn du eine Entität hast, die aus vielen abhängigen oder miteinander verbundenen Sub-Entitäten besteht, dann kann das Composite Entity Pattern sinnvoll sein. Es hilft, diese Sub-Entitäten zu einer einzigen übergeordneten Entität zu kombinieren, sodass die gesamte Struktur leichter verwaltet und genutzt werden kann.

Beispiel: Eine Order-Entität in einem E-Commerce-System, die mehrere Product– und Inventory-Objekte enthält. Diese Sub-Entitäten sind voneinander abhängig und zusammen bilden sie die komplette Bestellung.

2. Häufige Aggregation und Zusammensetzung von Objekten:

Wenn du regelmäßig mehrere Objekte kombinieren musst, um eine komplexe Entität zu repräsentieren (z.B. Produktinformationen und Bestandsdaten in einer Bestellung), dann kann das Composite Entity Pattern helfen, diese Objekte als eine einzige Entität zu behandeln, ohne die einzelnen Sub-Objekte explizit zu verwalten.

Beispiel: In einem System für Kundenaufträge könnten die einzelnen Bestellpositionen (Produkte) in einer CompositeEntity zusammengefasst werden, sodass der Benutzer die gesamte Bestellung in einem Schritt abfragen kann.

3. Vermeidung der direkten Interaktion mit Sub-Entitäten:

Wenn du die Komplexität reduzieren möchtest und nicht möchtest, dass Clients mit den verschiedenen Sub-Entitäten direkt interagieren (z.B. Product, Inventory, etc.), dann ist das Composite Entity Pattern nützlich. Die Composite-Entität stellt eine vereinfachte Schnittstelle zur Verfügung, über die der Benutzer auf alle relevanten Sub-Entitäten zugreifen kann.

Beispiel: Anstatt direkt mit den Produkten und deren Beständen zu arbeiten, kann die Anwendung einfach die Bestellung (die Composite-Entität) abfragen und sich die Details von dort holen.

4. Zusammenfassen und Kapseln von Geschäftslogik:

In manchen Fällen ist es sinnvoll, die Geschäftslogik, die auf den Sub-Entitäten basiert, in einer zentralen Stelle zu kapseln. Das Composite Entity Pattern kann dabei helfen, die Komplexität der Geschäftslogik zu reduzieren, indem die verschiedenen Logiken (z.B. für die Berechnung des Gesamtpreises einer Bestellung) in der Composite-Entität zusammengefasst werden.

Beispiel: Berechnungen, wie z.B. die Gesamtsumme der Bestellung, könnten direkt in der Order-Klasse durchgeführt werden, die sowohl die Produkte als auch deren Bestände kennt.

5. Unterstützung für verteilte Systeme:

In verteilten Systemen kann es nützlich sein, dass komplexe Objekte, die mehrere Entitäten umfassen, als eine einzelne Entität behandelt werden. Das Composite Entity Pattern kann dann dafür sorgen, dass die Kommunikation zwischen den Systemen vereinfacht wird, da alle zusammengehörigen Daten als eine einzige Composite-Entität übermittelt werden können.

Beispiel: In einem Microservices-Architektur könnte das Composite Entity Pattern helfen, eine Bestellung (die aus mehreren Entitäten wie Produkten, Preisen, Lagerbeständen besteht) als eine einzige Composite-Entität zu serialisieren und an andere Services zu übertragen.

6. Verhinderung von unübersichtlichem Code durch viele abhängige Entitäten:

Wenn du es vermeidest, dass der Code durch viele verschiedene abhängige Entitäten unnötig unübersichtlich wird, kann das Composite Entity Pattern als Entwurfsmuster sehr hilfreich sein. Es hilft, eine saubere Trennung der Verantwortlichkeiten zu wahren und sorgt dafür, dass der Code modularer und wartungsfreundlicher bleibt.


Wann sollte das Composite Entity Pattern nicht verwendet werden?

  • Einfachheit der Entitäten: Wenn die Entitäten nicht sehr komplex sind und keine großen Zusammenhänge mit anderen Entitäten haben (z.B. bei einfachen, unabhängigen Objekten), kann der Einsatz des Composite Entity Patterns unnötig sein und den Code nur verkomplizieren.
  • Leistung: Wenn die Anwendung sehr performancekritisch ist und das Zusammenfassen von Entitäten zu einer Composite-Entität unnötigen Overhead erzeugt (z.B. zusätzliche Verarbeitungszeit oder Speicherbedarf), könnte ein einfacherer Ansatz besser geeignet sein.
  • Flexibilität: Wenn die Entitäten in sehr unterschiedlichen Kontexten verwendet werden und stark variieren, könnte das Composite Entity Pattern zu einer engen Koppelung führen, was die Flexibilität einschränkt.

Insgesamt ist das Composite Entity Pattern nützlich, wenn du komplexe Entitäten modellieren möchtest, die viele miteinander verbundene Sub-Entitäten beinhalten, und du diese in einer einheitlichen Weise behandeln willst.

Fazit

Das Composite Entity Pattern ist ein nützliches Muster, das hilft, die Komplexität beim Arbeiten mit komplexen Entitäten zu reduzieren. Es ermöglicht eine saubere Trennung zwischen den einzelnen Entitäten und der Composite Entity, die als einzelne Geschäftseinheit betrachtet wird. Durch die Vereinfachung der Schnittstelle können Änderungen an den Sub-Entitäten vorgenommen werden, ohne die gesamte Architektur zu beeinflussen.

Zurück zur Pattern-Liste: Liste der Design-Pattern

com

Newsletter Anmeldung

Bleiben Sie informiert! Wir informieren Sie über alle neuen Beiträge (max. 1 Mail pro Woche – versprochen)