複合モード
また、全体的なパターンの一部として知られている複合モード(Compositeパターン)は、単一のオブジェクトと同様のオブジェクトのグループのためのものです。 部分と全体のレベルを表すオブジェクトを結合するために、ツリー構造に基づいて、組合せパターン。 デザインパターンのこのタイプは、ターゲットグループのツリー構造を作成し、構造モデルに属します。
クラスを作成したこのパターンは、オブジェクトの独自のグループが含まれています。 このクラスは、同じオブジェクトのグループを変更する方法を提供します。
以下の実施例により私たちは、モードの組み合わせの使用を実証します。 例としては、組織内の従業員の階層を示しています。
入門
意図: "の部分-全体」を表現するには、ツリー構造にオブジェクトを構成する階層を。複合モードは一様に、オブジェクトの単一のオブジェクトおよび組成物を使用することを可能にします。
主に解決するために:これは、単純な要素と複雑な要素の概念をぼかし、私たちのツリーの問題だ、クライアントは複雑な要素を処理するために、単純ななどの要素を扱うことができ、クライアントと複雑な要素のデカップリングの内部構造となるよう。
ときに使用する方法:1、あなたは部分を表現するオブジェクト-全階層(ツリー)。図2は、様々なユーザーが単一のオブジェクトとオブジェクトの組み合わせを無視すると、ユーザはすべてのオブジェクトのための統一された構造を組み合わせることになります。
修正方法:枝や葉が統一されたインタフェースを実現するために、インターフェイスは内部の枝を組み合わせたものです。
キーコード:インタフェースの木材内部構成、およびコンポーネントを入れて内部属性の一覧が含まれています。
応用例:1、別の演算子ツリーの操作、演算子、および他のオペランドかもしれオペランド、演算子、および他のオペランドを含む算術式、。2、JAVA AWTとSwingは、ボタンやチェックボックスのための葉、コンテナの木の枝です。
利点:1、高レベルのモジュールは、単純なコール。2、ノードは自由を増加させました。
短所:組み合わせモードを使用する場合、その葉や枝は、依存関係逆転の原則に違反して、代わりにインタフェースで、クラス宣言を実施しています。
このようなツリーメニュー、ファイル、フォルダ管理などの一部、全体的なシーン、:使用シナリオ 。
注:特定のカテゴリを定義する場合。
実現
私たちは、クラスがモデルクラスの組み合わせとして扱われ、クラスの従業員を有しています。CompositePatternDemoは、我々は部門階層を追加するには、クラスEmployeeクラスの使用を実証し、全従業員を表示します。
ステップ1
Employeeクラス、Employeeオブジェクトのリストを持つクラスを作成します。
Employee.java
輸入はjava.util.ArrayList; 輸入java.util.Listに。 パブリッククラスEmployee { プライベート文字列名; プライベート文字列DEPT。 プライベートint型の給与。 プライベートリスト<従業員>部下。 //コンストラクタpublic従業員(文字列名、文字列DEPT、int型のSAL){ this.name =名; this.dept = DEPT。 this.salary = SAL; 部下=新しいのArrayList <従業員>(); } 公共ボイド追加(従業員e)の{ subordinates.add(E)。 } 公共ボイドのremove(従業員e)の{ subordinates.remove(E)。 } 公共の一覧<従業員> getSubordinates(){ 部下を返します。 } 公共の文字列のtoString(){ リターン(「従業員:[名: "+名前 + "、部署:" + DEPT + "、給料:" +給与+ "]"); } }
ステップ2
従業員の階層を作成し、印刷するEmployeeクラスを使用します。
CompositePatternDemo.java
パブリッククラスCompositePatternDemo { 公共の静的な無効メイン(文字列[] args){ 従業員の最高経営責任者(CEO)=新しい従業員( "ジョン"、 "最高経営責任者(CEO)"、30000); 従業員headSales =新しい従業員(「ロバート」、「ヘッド販売 "、20000); 従業員headMarketing =新しい従業員(「ミッシェル」、「ヘッドマーケティング "、20000); 従業員clerk1 =新しい従業員(「ローラ」、「マーケティング」、10000); 従業員clerk2 =新しい従業員(「ボブ」、「マーケティング」、10000); 従業員salesExecutive1 =新しい従業員(「リチャード」、「販売」、10000); 従業員salesExecutive2 =新しい従業員( "ロブ"、 "販売"、10000); CEO.add(headSales)。 CEO.add(headMarketing)。 headSales.add(salesExecutive1)。 headSales.add(salesExecutive2)。 headMarketing.add(clerk1)。 headMarketing.add(clerk2)。 //すべての組織の従業員のSystem.out.println(CEO)を印刷します。 {:(CEO.getSubordinates()従業員headEmployee)のために System.out.println(headEmployee)。 以下のための(従業員:headEmployee.getSubordinates()){ System.out.println(従業員)。 } } } }
ステップ3
出力を確認します。
従業員:[名:ジョン、DEPT:最高経営責任者(CEO)、給与:30000] 従業員:[名:Robert、DEPT:ヘッド販売、給与:20000] 従業員:[名:リチャード、DEPT:販売、給与:10000] 従業員:[名:ロブ、DEPT:販売、給与:10000] 従業員:[名:ミシェル、DEPT:ヘッドマーケティング、給与:20000] 従業員:[名前:ローラ、DEPT:マーケティング、給与:10000] 従業員:[名:ボブ、DEPT:マーケティング、給与:10000]