ホームページ  >  記事  >  Java  >  Java設計パターン構成パターン例分析

Java設計パターン構成パターン例分析

PHPz
PHPz転載
2023-05-05 20:28:051330ブラウズ

1.基本的な紹介

1) 部分全体パターンとも呼ばれる複合パターンは、オブジェクト グループのツリー構造を作成し、オブジェクトをツリー構造に組み合わせて「全体」と「部分」の階層関係を表現します。

2) 結合モードでは、ツリー構造に従ってオブジェクトを結合し、部品と階層全体を表現します。

3) このタイプのデザイン パターンは、構造パターンに属します

4) 結合モードにより、ユーザーは単一のオブジェクトと結合されたオブジェクトに一貫してアクセスできるようになります。つまり、結合により、顧客は個別のオブジェクトと結合されたオブジェクトを一貫した方法で処理できるようになります

2. 構造

組み合わせモードには主に 3 つの役割が含まれます:

  • 抽象ルート ノード (コンポーネント): システムのすべてのレベルでオブジェクトの共通メソッドと属性を定義し、いくつかのデフォルトの動作と属性を事前定義できます。

  • ブランチ ノード (複合): ブランチ ノードの動作を定義し、子ノードを保存し、ブランチ ノードとリーフ ノードを組み合わせてツリー構造を形成します。

  • リーフ ノード (Leaf): その下に分岐のないリーフ ノード オブジェクトは、システム レベルのトラバーサルの最小単位です。

3. 組み合わせモードによって解決される問題

1) この問題を解決するのが組み合わせパターンであり、処理したいオブジェクトがツリー構造を生成でき、そのツリー上のノードやリーフを操作したい場合、それがどのようなものであるかに関係なく、一貫した方法を提供できます。はノードまたはリーフです

2) 対応する回路図

Java設計パターン構成パターン例分析

#4. 学校部門の表示を解決するための組み合わせモデル

1 ) 応用例 要件

学校の学部構成を表示するプログラムを作成してください: 学校の学部構成を 1 ページに表示するには、学校には複数の学部があり、大学には複数の学部があります。

2) アイデアの分析と図解 (クラス図)

Java設計パターン構成パターン例分析

##3) コードの実装

コンポーネント複合オブジェクト宣言インターフェイス

package com.zte;
public abstract class OrganizationComponent {
    private String name;// 名字
    private String des;// 说明
    public String getName() {
        return name;
    }
    public String getDes() {
        return des;
    }
    protected void add(OrganizationComponent organizationComponent) {
        // 默认实现
        throw new UnsupportedOperationException();
    }
    protected void remove(OrganizationComponent organizationComponent) {
        // 默认实现
        throw new UnsupportedOperationException();
    }
    // 构造器
    public OrganizationComponent(String name, String des) {
        this.name = name;
        this.des = des;
    }
    // 方法print,抽象方法
    protected abstract void print();
}

複合非リーフノード

package com.zte;
import java.util.ArrayList;
import java.util.List;
// University 就是 Composite,可以管理College
public class University extends OrganizationComponent {
    List<OrganizationComponent> organizationComponentList = new ArrayList<>();
    // 构造器
    public University(String name, String des) {
        super(name, des);
    }
    //重写add
    @Override
    protected void add(OrganizationComponent organizationComponent) {
        organizationComponentList.add(organizationComponent);
    }
    // 重写remove
    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        organizationComponent.remove(organizationComponent);
    }
    @Override
    protected void print() {
        System.out.println("==========" + getName() + "=========");
        for (OrganizationComponent organizationComponent : organizationComponentList) {
            organizationComponent.print();
        }
    }
    @Override
    public String getName() {
        return super.getName();
    }
    @Override
    public String getDes() {
        return super.getDes();
    }
}

複合非リーフノード

package com.zte;
import java.util.ArrayList;
import java.util.List;
public class College extends OrganizationComponent {
    // list中存放department
    List<OrganizationComponent> organizationComponentList = new ArrayList<>();
    public College(String name, String des) {
        super(name, des);
    }
    //重写add
    @Override
    protected void add(OrganizationComponent organizationComponent) {
        organizationComponentList.add(organizationComponent);
    }
    // 重写remove
    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        organizationComponent.remove(organizationComponent);
    }
    @Override
    protected void print() {
        System.out.println("==========" + getName() + "=========");
        for (OrganizationComponent organizationComponent : organizationComponentList) {
            organizationComponent.print();
        }
    }
    @Override
    public String getName() {
        return super.getName();
    }
    @Override
    public String getDes() {
        return super.getDes();
    }
}

リーフリーフノード

package com.zte;
public class Department extends OrganizationComponent {
    public Department(String name, String des) {
        super(name, des);
    }
    // add和remove方法就不需要再写了
    @Override
    protected void print() {
        System.out.println("===========" + getName() + "=========");
    }
    @Override
    public String getName() {
        return super.getName();
    }
    @Override
    public String getDes() {
        return super.getDes();
    }
}
package com.zte;
public class Client {
    public static void main(String[] args) {
        // 创建大学
        OrganizationComponent university = new University("清华大学", "中国最好的大学");
        // 创建学院
        OrganizationComponent college1 = new College("计算机学院", "计算机学院");
        OrganizationComponent college2 = new College("信息工程学院", "信息工程学院");
        // 创建各个学院下面的系
        college1.add(new Department("软件工程", "软件工程"));
        college1.add(new Department("网络工程", "网络工程"));
        college1.add(new Department("计算机科学与技术", "老牌专业"));
        college2.add(new Department("通信工程", "通信工程"));
        college2.add(new Department("信息工程", "信息工程"));
        // 将学院添加到学校中
        university.add(college1);
        university.add(college2);
        // 打印大学底下的所有院系
        university.print();
        // 打印学院底下的所有系
        college1.print();
    }
}

5. 結合モードの注意事項と詳細

1) クライアントの操作を簡素化し、クライアントは部分全体の問題やノードの葉の問題を考慮せず、一貫性のあるオブジェクトのみに直面するだけで済みます

2) 強力な拡張性を備えています。内部の階層関係を調整するだけでよく、クライアントは変更を加える必要がありません。

3) 複雑な階層構造を作成するのに便利です。クライアントは、構成の詳細に注意を払う必要はありません。組み合わせが簡単で、ノードやリーフを追加して複雑なツリー構造を作成するのも簡単です。

4) 組織構造を横断する必要がある場合、または処理対象のオブジェクトがツリー構造になっている場合に使用するのに非常に適しています。結合モード

5) ノードとリーフの間に多くの違いがある場合、高度な抽象化が必要です。たとえば、多くのメソッドやプロパティが異なるため、結合モードの使用は適していません

以上がJava設計パターン構成パターン例分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。