複合定義:ツリー構造内のオブジェクトを整理して、「部分的な」階層を実現し、クライアントが個々のオブジェクトと結合されたオブジェクトを一貫して使用するようにします。
Compositeは理解しやすくなります。組成本体のこれらのオブジェクトには、共通のインターフェイスがあります。コンポジットボディのオブジェクトの方法が呼び出された場合、コンポジットはツリー構造全体を通過し、この方法を含むオブジェクトを見つけ、呼び出し実行を実装します。それは、100の動きを引っ張ると説明できます。
したがって、コンポジットモードは、責任モードのチェーンに似たイテレータモードを使用します。
複合利点:
1.クライアントの呼び出しをシンプルにすると、クライアントは一貫した方法でコンビネーション構造または単一のオブジェクトを使用できます。コード。
2。組み合わせボディにオブジェクトパーツを追加する方が簡単です。クライアントは、新しいオブジェクトコンポーネントを追加したため、コードを変更する必要はありません。
Compositeの使用方法
まず、インターフェイスまたは抽象的なクラスを定義します。複合組成物の管理(またはコンポーネント)。
次のコードは抽象クラスとして定義されており、通常、可能な限りインターフェイスを使用しようとします。
コードコピーは次のとおりです。
パブリックアブストラクトクラス機器{
プライベート文字列名;
//インターネット価格
パブリックアブストラクトdouble netprice();
//割引価格
パブリックアブストラクトダブルディスカウントプライス();
//パーツメソッドを追加します
public boolean add(機器){false;}
//パーツメソッドを削除します
public boolean remove(機器){false;}
//ここに注意してください、ここにコンポーネントクラスにアクセスする方法があります。
public Iterator iter(){return null;
パブリック機器(最終文字列名){this.name = name}
}
抽象クラス機器はコンポーネントの定義であり、複合クラスのオブジェクトを表し、いくつかの一般的な方法が機器に定義されています。
コードコピーは次のとおりです。
パブリッククラスディスクは機器を拡張します{
public disk(string name){super(name);
//ディスクネットワークの価格を1に定義します
public double netprice(){return 1。}
//ディスク割引価格は0.5%オフです。
public double discountprice(){return .5;
}
ディスクは、単一の要素(原始)である組み合わせボディのオブジェクトまたはコンポーネントです。
別の可能性は、コンポーネントも組み合わせであることです。つまり、このコンポーネントの下に「息子」があり、理解しやすいです。次に、この組み合わせを定義する必要があります。
コードコピーは次のとおりです。
抽象クラスの複合機器は機器を拡張します{
private int i = 0;
//「息子」を保存するベクトルを定義します
プライベートLSIT機器= new ArrayList();
public composite -quipment(string name){super(name);
Public Boolean Add(機器機器){
this.equipment.add(機器);
trueを返します。
}
public double netprice(){
double netprice = 0。;
iterator iter = quipter.iterator();
for(iter.hasnext())
netprice+=((sequipment)iter.next())。netprice();
NetPriceを返します。
}
Public Double DiscountPrice(){
double discountprice = 0。;
iterator iter = quipter.iterator();
for(iter.hasnext())
DiscountPrice+=((sequipment)iter.next())。割引Price();
返品割引プライス;
}
//ここで注意してください、ここにあなた自身の組み合わせでコンポーネントにアクセスする方法があります。
//上記のディスクが存在しない理由は、ディスクが単一の要素であるためです。
public Iterator iter(){
return quirty.iterator();
}
// Iteratorメソッドをオーバーロードします
public boolean hasnext(){return i <quirty.size();
// Iteratorメソッドをオーバーロードします
public Object next(){
if(hasnext())
return quiption.elementat(i ++);
それ以外
新しいnosuchelementexception();
}
}
上記の複合機器は、機器を継承し、内部のオブジェクトの外部アクセスメソッドを提供します。
複合機器の2つのカテゴリを見てみましょう。ディスクボックスシャーシとボックスキャビネットは、ベースプレート、パワーボックス、ハードディスクボックスなどですハードディスクフロッピードライブなどのボックス。間違いなく、これらはどちらも組み合わせています。
コードコピーは次のとおりです。
パブリッククラスのシャーシはcomposite -quipmentを拡張します{
public chassis(string name){super(name);
public double netprice(){return 1.+super.netprice();
public double discountprice(){return .5+super.discountprice();
}
パブリッククラスキャビネットはcomposite -quipmentを拡張します{
パブリックキャビネット(文字列名){super(name);
public double netprice(){return 1.+super.netprice();
public double discountprice(){return .5+super.discountprice();
}
これまでに、複合モデル全体のアーキテクチャを完了しています。
Composeを呼び出すクライアントのコードを見ることができます。
コードコピーは次のとおりです。
キャビネットキャビネット=新しいキャビネット( "タワー");
シャーシシャーシ= new Chassis( "PC Chassis");
// PCシャーシをタワーに挿入します(ディスクをボックスに詰めます)
Cabinet.Add(シャーシ);
// 10GBのハードドライブをPCシャーシに挿入します(ハードドライブをディスクボックスにインストールします)
chassis.add(new disk( "10 gb"));
// netprice()メソッドを呼び出します。
system.out.println( "netprice ="+cabinet.netprice());
System.out.println( "DiscountPrice ="+cabinet.discountprice());
上記の方法は、netprice()またはdiscoundprice()です。実際、複合材はイテレーターを使用してツリー構造全体を通過し、この方法を含むオブジェクトを見つけ、コール実行を実装します。
Compositeは、実用的なアプリケーションでは、このモデルを使用できるかどうかを試すことができます。
フォーラムを撮影すると、バージョン(フォーラム)があります、そのため、Jiveを入力して、それがどのように実装されているかを見てみましょう。
Jive Anatomy
Jiveでは、forumthreadはforummessageのコンテナコンテナ(組み合わせ)です。つまり、forumthreadは、以前の例の複合式に似ています。
コードコピーは次のとおりです。
[糸]
| - [メッセージ]
| - [メッセージ]
| - [メッセージ]
| - [メッセージ]
| - [メッセージ]
次のコードがforumthreadに表示されます。
コードコピーは次のとおりです。
public interface forumthread {
...
public void addmessage(forummessage parentmessage、forummessage newmessage)
不正なエクセプトをスローします。
public void deletemessage(forummessageメッセージ)
不正なエクセプトをスローします。
public Iteratorメッセージ();
...
}
compositeepipmentと同様に、独自の組み合わせボディのコンポーネントにアクセスする方法を提供します:追加、削除、およびトラバース。
他のモデルでのJiveの分析に基づいて、基本的にJiveフォーラムシステムのフレームワークを理解しています。 。