Javaのコンポジットデザインパターン

Javaの複合デザインパターン

1. 前書き

このクイックチュートリアルでは、Javaの複合デザインパターンを紹介します。

構造とその使用目的について説明します。

2. 構造

複合パターンは、個々のオブジェクトとオブジェクトの構成、または「複合」を同じように処理できるようにすることを目的としています。

基本型を継承する型で構成されたツリー構造と見なすことができ、オブジェクトの単一部分または階層全体を表すことができます。

パターンを次のように分類できます。

  • component –コンポジション内のすべてのオブジェクトのベースインターフェイスです。 子コンポジットを管理するための共通メソッドを備えたインターフェースまたは抽象クラスのいずれかでなければなりません。

  • leaf-基本コンポーネントのデフォルトの動作を実装します。 他のオブジェクトへの参照は含まれていません。

  • 複合–リーフ要素があります。 基本コンポーネントメソッドを実装し、子関連の操作を定義します。

  • client –ベースコンポーネントオブジェクトを使用して構成要素にアクセスできます。

3. 実用例

それでは、実装について詳しく見ていきましょう。 we want to build a hierarchical structure of departments in a company.としましょう

3.1. 基本コンポーネント

コンポーネントオブジェクトとして、単純なDepartmentインターフェースを定義します。

public interface Department {
    void printDepartmentName();
}

3.2. 葉

リーフコンポーネントについて、財務部門と営業部門のクラスを定義しましょう。

public class FinancialDepartment implements Department {

    private Integer id;
    private String name;

    public void printDepartmentName() {
        System.out.println(getClass().getSimpleName());
    }

    // standard constructor, getters, setters
}

2番目のリーフクラスSalesDepartment,も同様です。

public class SalesDepartment implements Department {

    private Integer id;
    private String name;

    public void printDepartmentName() {
        System.out.println(getClass().getSimpleName());
    }

    // standard constructor, getters, setters
}

どちらのクラスも、基本コンポーネントからprintDepartmentName()メソッドを実装し、それぞれのクラス名を出力します。

また、これらはリーフクラスであるため、他のDepartmentオブジェクトは含まれていません。

次に、複合クラスも見てみましょう。

3.3. 複合要素

複合クラスとして、HeadDepartmentクラスを作成しましょう。

public class HeadDepartment implements Department {
    private Integer id;
    private String name;

    private List childDepartments;

    public HeadDepartment(Integer id, String name) {
        this.id = id;
        this.name = name;
        this.childDepartments = new ArrayList<>();
    }

    public void printDepartmentName() {
        childDepartments.forEach(Department::printDepartmentName);
    }

    public void addDepartment(Department department) {
        childDepartments.add(department);
    }

    public void removeDepartment(Department department) {
        childDepartments.remove(department);
    }
}

This is a composite class as it holds a collection of Department components、およびリストから要素を追加および削除するためのメソッド。

複合printDepartmentName()メソッドは、リーフ要素のリストを反復処理し、各要素に適切なメソッドを呼び出すことによって実装されます。

4. テスト

テストの目的で、CompositeDemoクラスを見てみましょう。

public class CompositeDemo {
    public static void main(String args[]) {
        Department salesDepartment = new SalesDepartment(
          1, "Sales department");
        Department financialDepartment = new FinancialDepartment(
          2, "Financial department");

        HeadDepartment headDepartment = new HeadDepartment(
          3, "Head department");

        headDepartment.addDepartment(salesDepartment);
        headDepartment.addDepartment(financialDepartment);

        headDepartment.printDepartmentName();
    }
}

最初に、財務部門と営業部門用に2つのインスタンスを作成します。 その後、本部をインスタンス化し、以前に作成したインスタンスを追加します。

最後に、printDepartmentName()合成メソッドをテストできます。 予想どおり、the output contains the class names of each leaf component

SalesDepartment
FinancialDepartment

5. 結論

この記事では、複合設計パターンについて学びました。 この記事では、主要な構造を強調し、実際の例を通して使用方法を示します。

いつものように、完全なコードはGithub projectで入手できます。