コンビネーションモード
部分全体パターンとも呼ばれる複合パターンは、類似したオブジェクトのグループを単一のオブジェクトとして扱うために使用されます。合成モードでは、部分階層と全体階層を表すために使用されるツリー構造に従ってオブジェクトが結合されます。このタイプのデザイン パターンは構造パターンであり、オブジェクトのグループのツリー構造を作成します。
このパターンは、独自のオブジェクトのグループを含むクラスを作成します。このクラスは、同一のオブジェクトのグループを変更する方法を提供します。
次の例を通じて、組み合わせモードの使用法を示します。この例は、組織内の従業員の階層を示しています。
はじめに
目的: オブジェクトをツリー構造に結合して、「部分全体」の階層を表します。合成パターンにより、ユーザーは単一オブジェクトと複合オブジェクトを一貫して使用できます。
主な解決策: ツリー構造の問題における単純な要素と複雑な要素の概念があいまいになります。クライアント プログラムは、単純な要素と同じ方法で複雑な要素を処理できるため、クライアント プログラムの内部構造が異なります。複雑な要素。
いつ使用するか: 1. オブジェクトの部分全体の階層 (ツリー構造) を表現したい。 2. ユーザーには、結合されたオブジェクトと単一のオブジェクトの違いを無視して、結合された構造内のすべてのオブジェクトを均一に使用してもらいたいと考えています。
解決方法: ブランチとリーフは統一されたインターフェイスを実装しており、インターフェイスはブランチ内で結合されています。
キーコード: ブランチはこのインターフェースを内部的に結合し、コンポーネントを含む内部属性 List を含みます。
応用例: 1. 算術式にはオペランド、演算子、および別のオペランドが含まれます。ここで、別の演算子は演算ツリー、演算子、および別のオペランドになることもあります。 2. JAVA AWT および SWING では、ボタンとチェックボックスがリーフであり、コンテナがブランチです。
利点: 1. 高レベルのモジュール呼び出しが簡単です。 2. ノードは自由に追加できます。
欠点: 組み合わせパターンを使用する場合、そのリーフとブランチの宣言はインターフェイスではなく実装クラスとなり、依存関係逆転の原則に違反します。
使用シナリオ: ツリーメニュー、ファイルとフォルダーの管理などの部分的および全体的なシナリオ。
注: 定義されたときは具象クラスです。
実装
複合モデルクラスとして扱われるクラスEmployeeがあります。 CompositePatternDemo のデモ クラスは、Employee クラスを使用して部門階層を追加し、すべての従業員を出力します。
ステップ 1
Employee オブジェクトのリストを含む Employee クラスを作成します。
Employee.java
import java.util.ArrayList; import java.util.List; public class Employee { private String name; private String dept; private int salary; private List<Employee> subordinates; //构造函数 public Employee(String name,String dept, int sal) { this.name = name; this.dept = dept; this.salary = sal; subordinates = new ArrayList<Employee>(); } public void add(Employee e) { subordinates.add(e); } public void remove(Employee e) { subordinates.remove(e); } public List<Employee> getSubordinates(){ return subordinates; } public String toString(){ return ("Employee :[ Name : "+ name +", dept : "+ dept + ", salary :" + salary+" ]"); } }
ステップ 2
Employee クラスを使用して従業員階層を作成し、出力します。
CompositePatternDemo.java
public class CompositePatternDemo { public static void main(String[] args) { Employee CEO = new Employee("John","CEO", 30000); Employee headSales = new Employee("Robert","Head Sales", 20000); Employee headMarketing = new Employee("Michel","Head Marketing", 20000); Employee clerk1 = new Employee("Laura","Marketing", 10000); Employee clerk2 = new Employee("Bob","Marketing", 10000); Employee salesExecutive1 = new Employee("Richard","Sales", 10000); Employee salesExecutive2 = new Employee("Rob","Sales", 10000); CEO.add(headSales); CEO.add(headMarketing); headSales.add(salesExecutive1); headSales.add(salesExecutive2); headMarketing.add(clerk1); headMarketing.add(clerk2); //打印该组织的所有员工 System.out.println(CEO); for (Employee headEmployee : CEO.getSubordinates()) { System.out.println(headEmployee); for (Employee employee : headEmployee.getSubordinates()) { System.out.println(employee); } } } }
ステップ 3
出力を確認します。
りー