複合モード
リーフ部材と容器部材と容器部材内の構造の存在は、それらが組織を形成する目的、リーフ部材は、メンバオブジェクトを含めることができないことは、関心の組み合わせパターンは、容器手段は、オブジェクトのメンバを含むことができる、オブジェクトのこれらの部材は、リーフ部材オブジェクトであってもよく、それがあってもよいです。これらのオブジェクトは、ツリー構造を構成することができる、ツリー構造は、オブジェクト指向アプローチによる処理パターンの組み合わせです。
モードモチベーション
フォルダ内のサブフォルダを含めることができる2つのタイプのオブジェクトを含むファイルとフォルダのWindowsオペレーティングシステムのファイル・ディレクトリ構造では、ファイルをも含めることができます。フォルダはコンテナであり、ファイルの種類の様々なフォルダが別のフォルダの一員として大きくすることができ、また、葉のクラスと呼ばれ、クラスのメンバーです。組み合わせパターンは、使用中に、オブジェクトにオブジェクトを同じ処理容器や葉を行うことができたときに、ユーザーのニーズが区別ないことを、コンテナオブジェクトとリーフは、再帰的構成オブジェクト方法を説明しました。
スキーマ定義
の「不可欠な部分」の階層を - 複数のオブジェクトを組み合わせて表現するツリー構造を形成します。
モード構造
コンポーネント(抽象メンバー)
抽象コンポーネントは、インターフェースまたは抽象クラスであることができ、容器部材は、すべてのサブクラスを合計宣言を含み、アクションを実装することが可能な役割のリーフ部材オブジェクト宣言のインターフェースです。そのような増加したサブコンポーネント、削除サブコンポーネント、サブコンポーネント、および他の取得などのそのサブコンポーネントメソッドのアクセスおよび管理の定義で抽象的コンポーネントです。
リーフ(葉のメンバー)
リーフ部材リーフノードは、抽象メンバで定義された動作を達成するために、複合構造において、リーフノードは子を持たないオブジェクトを表します。サブ部材へのアクセスを管理する方法は、異常等により処理してもよいです。
複合(容器手段)
容器内の複合構造ノードオブジェクト内の容器部材を表し、リーフノードの子ノードとすることができるノードの子ノードを含む容器は、ノードは、子ノードのセットを格納するための提供の容器とすることが抽象メンバで定義された動作を実現することができますアクセスし、再帰的にその子ノードのビジネスメソッドを呼び出すことができ、事業法にサブコンポーネントアプローチを管理するものを含みます。
クライアント(クライアントのカテゴリ)
クライアントクラスは抽象部材を介して部材を組み合わせてオブジェクトのアクセスと制御とのインタフェースです。
パターン分析
キーは抽象コンポーネントクラスの組み合わせパターンを定義し、両方の端部に集中することができるリーフまたはコンテナを、それをさ知らず、また容器、および抽象コンポーネントクラスに対するクライアント・プログラムを表すことができ、葉を表してもよいです。
抽象クラスのメンバーは、一般に、インターフェースまたは抽象クラス、抽象クラスメンバー方法を共有するすべての宣言および実装をサブクラス化するように設計されました。クライアント側のプログラミングのために、そのサブクラスに関係なく、プログラミングの抽象コンポーネントは、コンテナのコンポーネントまたはリーフ部材です。
public abstract class Component {
public abstract void add(Component c);
public abstract void remove(Component c);
public abstract Component getChild(int i);
public abstract void operation();
}
継承抽象メンバー葉のメンバーであるアクセスサブメンバーにビジネス方法と管理や方法を含め、すべてのメソッドは、クラスで宣言抽象構文を実装するために、リーフメンバーの必要性は、以下の典型的なコードですが、葉のメンバーは、サブメンバーが含まれていないので、クライアント例外処理やエラーメッセージがサブコンポーネントのメソッド呼び出しとリーフのアクセス管理コンポーネントを提供しなければなりません。
public class Leaf extends Component {
@Override
public void add(Component c) {
//异常处理或错误提示
}
@Override
public void remove(Component c) {
//异常处理或错误提示
}
@Override
public Component getChild(int i) {
//异常处理或错误提示
return null;
}
@Override
public void operation() {
//实现代码
}
}
建設容器部材の必要性は、ビジネス方法およびサブコンポーネントの実装にアクセスし、管理するための方法を含むクラスで宣言されたすべての抽象メソッドを実装します。コンテナは、コンテナコンポーネントは、操作容器部材()メソッドを再帰的に、すなわち、メンバーのメンバーを含む、部材は再帰アルゴリズムを使用して、そのビジネスメソッドのメンバーを呼び出す役割として作用するので、構成部材のその動作()メソッドを呼び出します。
public class Composite extends Component {
private ArrayList list = new ArrayList();
@Override
public void add(Component c) {
list.add(c);
}
@Override
public void remove(Component c) {
list.remove(c);
}
@Override
public Component getChild(int i) {
return (Component) list.get(i);
}
@Override
public void operation() {
for (Object o : list) {
((Component) o).operation();
}
}
}
組み合わせの安全なコンビネーションモードとトランスペアレントモード
組合せパターンの形態は、抽象クラスのメンバを定義する、透過モードとの組み合わせモード安全組み合わせに分けることができます
トランスペアレントモードの組み合わせ
トランスペアレント組み合わせモードは、抽象コンポーネントコンポーネントは、メンバーオブジェクトを管理するためのすべてのメソッドを宣言し、そうすることの利点は、すべてのメンバーがインターフェイスの同じ種類を持っていることを確認することです。クライアントビューでは、メソッドの葉は、オブジェクトおよび提供コンテナオブジェクトには一貫性があり、クライアントが同じオブジェクトのすべてを扱うことができます。差がある自然の中で葉オブジェクトおよびコンテナオブジェクトので欠点は、安全な十分ではありません。
安全コンビネーションモード
安全コンビネーションモード抽象コンポーネントは、オブジェクトのメンバを管理するための任意のコンポーネントのメソッドを宣言していませんが、オブジェクトを管理するためのこれらのメンバーメソッドは、クラスコンポジットに宣言しました。リーフオブジェクトの場合、クライアントは、メンバーオブジェクトを管理する方法に呼び出すことはできません。欠点は、プログラムのために、クライアントが完全に抽象的でないことができ、透明性の欠如です。