ふくごう

11479 ワード

ふくごうパターン


複合モードを使用すると、クライアントは複合オブジェクトまたは単一オブジェクトに対して同じ処理を行うことができます.複合モードを使用すると、オブジェクトをツリー構造に整理して、部分的および全体的な階層を表すことができます.このモードでは、コンビネーション(複合)オブジェクトを作成できます.

使用時


複合オブジェクトと単一オブジェクトの処理方法が同じ場合は、「全体-ローカル」関係として定義され、効率的に定義できます.
ソース

クライアントクラスは、共通インタフェースコンポーネントのみに関連します.Leafはコンポーネントインタフェースを実装するオブジェクトであり、Compositeはコンポーネントのオブジェクトサブアイテムであり、リクエストを渡すために使用されます.

コード別複合モード


コンポーネント汎用インタフェース

package compositepattern;

public interface Graphic {
    public void print();
}

leafに対応する実装オブジェクト

package compositepattern;

public class Ellipse implements Graphic{
    @Override
    public void print() {
        System.out.println("Ellipse");
    }
}
Compositeインタフェースの内容が反映されています.

子どもの管理

package compositepattern;

import java.util.ArrayList;
import java.util.List;

public class CompositeGraphic implements Graphic{
    private List<Graphic> childGraphics = new ArrayList<Graphic>();

    @Override
    public void print() {
        for (Graphic graphic : childGraphics) {
            graphic.print();
        }
    }
    public void add(Graphic graphic) {
        childGraphics.add(graphic);
    }
    public void remove(Graphic graphic) {
        childGraphics.remove(graphic);
    }
}
インタフェースインプリメンテーションを保存できるリストを作成し、ストレージと削除機能を実現しました.
同時にコンポーネントの機能印刷をオーバーシュートした.

ドライバコードとその相互関係

package compositepattern;

public class Driver {
    public static void main(String[] args) {
        Ellipse ellipse1 = new Ellipse();
        Ellipse ellipse2 = new Ellipse();
        Ellipse ellipse3 = new Ellipse();
        Ellipse ellipse4 = new Ellipse();

        CompositeGraphic graphic = new CompositeGraphic();
        CompositeGraphic graphic1 = new CompositeGraphic();
        CompositeGraphic graphic2 = new CompositeGraphic();

        graphic1.add(ellipse1);
        graphic1.add(ellipse2);
        graphic1.add(ellipse3);

        graphic2.add(ellipse4);

        graphic.add(graphic1);
        graphic.add(graphic2);

        graphic.print();
    }
}
4つのリーフオブジェクトを作成し、コンビネーションオブジェクトシェイプ1,2にそれぞれ3つの1を入れます.
次に、複合オブジェクトに再配置して印刷します.
中の4つのオブジェクトが出力されているのが見えます.

このような構造が見られる.

コンポーネントの2つの方法


タイプの安定性


これまでに示された例は、タイプ安定性を追求する方法である.
Componentはサブエレメントを処理する方法がなく、Componentのみです.これにより、Leafはサブオブジェクトを処理するオブジェクトを呼び出すことができず、クライアントもそれを使用することができません.

コンシステンシ


一貫性を追求する方法は、Componentが子供を管理するすべての方法です.したがって、Leafはサブ管理メソッドを呼び出すことができ、クライアントはこのメソッドにアクセスすることができる.
理論上の複合モードは安定性よりも一貫性を強調する.
ソース