構造設計モードの組合せモード


  • モード構造
  • 概念:複数のオブジェクトを組み合わせてツリー構造を形成し、部分的-全体的な関係を持つ階層を表す.コンビネーション・モードを使用すると、クライアントは単一のオブジェクトとコンビネーション・オブジェクトを統一的に扱うことができます.
  • 構造:抽象部材Component+葉部材Leaf+容器部材Component

  • ぶんかつ
    区別する
    透明コンビネーションモード
    抽象コンポーネントComponentには、add()、remove()、getChild()など、メンバー・オブジェクトを管理するためのすべてのメソッドが宣言されています.これにより、すべてのコンポーネント・クラスに同じインタフェースがあることが保証されます.クライアントから見れば、リーフ・オブジェクトはコンテナ・オブジェクトが提供するメソッドと一致し、クライアントはすべてのオブジェクトを一貫して扱うことができます.
    セキュアコンビネーションモード
    抽象コンポーネントComponentは、ユーザーがメンバー・オブジェクトを管理する方法を宣言するのではなく、Componentでこれらの方法を宣言して実装します.この方法は、これらの管理メンバーオブジェクトをリーフオブジェクトにまったく提供しないため、リーフオブジェクトの場合、クライアントがこれらのメソッドを呼び出すことはできません.

  • 適用シーン
  • は、全体と部分を有する階層において、全体と部分の違いを無視することによって、クライアントが彼らを一致して扱うことができることを望んでいる.
  • オブジェクト向け言語を用いて開発されたシステムでは、ツリー構造を処理する必要がある.オペレーティングシステムのメニュー構造、ディレクトリ構造、会社の組織構造、xmlファイル、htmlファイル、jspファイルなど、ツリー構造が随所に見られます.
  • は、システム内で葉オブジェクトと容器オブジェクトを分離することができ、それらのタイプは固定されず、いくつかの新しいタイプを追加する必要がある.

  • 現在、xmlドキュメント処理ソフトウェアを開発する必要があり、キーワードクエリに基づいてコンテンツを指定することができ、ユーザーはxmlの中でクエリの初期ノードとして任意にノードを選択することができ、そのノードが置かれている階層に関心を持つ必要はありません.このニーズに対してコンビネーションモードを用いて設計する.
  •   xml    :
    
        
            
            
        
        
            
            
                
                
            
        
    
    public interface Component {
        public void findContent(String conent);
    }
    
    public class Leaf implements Component {
    
        private String name;
        private String content;
    
        public Leaf(String name,String content) {
            this.name = name;
            this.content = content;
        }
    
        @Override
        public void findContent(String conent) {
            if(this.content.equals(conent)){
                System.out.print( "   :" + this.name + "    " + conent + ",    :");
            }else{
                System.out.println( name + "     " + conent);
            }
        }
    }
    
    public class Composite implements Component {
    
        private ArrayList list = new ArrayList();
    
        private String name;
    
        public Composite(String name) {
            this.name = name;
        }
    
        //     
        public void add(Component component){
            list.add(component);
        }
    
        //     
        public void remove(Component component){
            list.remove(component);
        }
    
        //         
        public Component getChild(Integer index){
            return list.get(index);
        }
    
        @Override
        public void findContent(String conent) {
            System.out.print("      " + this.name + ",");
            for (Component component: list){
                component.findContent(conent);
            }
            System.out.print(this.name + "