コンビネーションモード(部分全体モード)

学部のニーズを見てください

学校の学部構造を表示するプログラムを作成します。要件は、学校の学部構成を1ページに表示すること、学校には複数の大学があり、大学には複数の学部があることです。示されているように:
ここに画像の説明を挿入

学部表示の従来のソリューション(クラス図)

ここに画像の説明を挿入

学部のディスプレイに存在する問題に対する従来の解決策の分析

  1. 大学を学校のサブカテゴリとして、学部を大学のサブカテゴリとして考えると、実際には、階層を分割する組織の規模に基づいています。
  2. 実際、私たちの要件は次のとおりです。学校の学部構成を1ページに表示する、学校には複数の大学があり、大学には複数の学部があるため、この種のスキーム**は十分に達成できない管理操作**などです。大学や学部への追加、削除、トラバースなど
  3. 解決策:学校、大学、学部を組織構造と見なすと、それらの間に継承された関係はなく、管理操作をより適切に実現できるツリー構造になります。=>コンビネーションモード

コンビネーションモードの基本的な紹介

基本的な紹介

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

  2. コンビネーションモードツリー構造に従ってオブジェクトを組み合わせる、部分的および全体的なレベルを表すために使用されます。

  3. このタイプのデザインパターンは構造パターンです。

  4. 組み合わせモードでは、ユーザーは単一のオブジェクトと結合されたオブジェクトへの一貫したアクセス、つまり:組み合わせにより、顧客は個々のオブジェクトと組み合わせたオブジェクトを一貫した方法で扱うことができます

組み合わせモードの原理クラス図

ここに画像の説明を挿入
原理構造図の説明-すなわち(複合モードの役割と責任)

  1. Component :これは、コンポジション内のオブジェクトの宣言インターフェイスです。適切な状況下で、コンポーネントサブコンポーネントにアクセスして管理するためのすべてのクラスに共通のインターフェイスのデフォルトの動作を実装します。コンポーネントは抽象クラスまたはインターフェイスにすることができます。

  2. Leaf :組み合わせのリーフノードを表し、リーフノードには子ノードがありません

  3. Composite :サブコンポーネントを格納し、追加や削除などのサブコンポーネント関連の操作をコンポーネントインターフェイスに実装するために使用される非リーフノード。

複合モードは、学部ディスプレイのアプリケーション例を解決します

アプリケーション例の要件

  1. 学校の学部構造を表示するプログラムを作成します。要件は、学校の学部構成を1ページに表示すること、学校には複数の大学があり、大学には複数の学部があることです。
  2. アイデアの分析とイラスト(クラス図)
    ここに画像の説明を挿入
    OrganizationComponentを介して集約

学部は(追加、削除、変更なしで)
大学を去り、大学は葉ではありません

  1. コード

.Javaクライアント

public class Client {
    
    

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		
		//从大到小创建对象 学校
		OrganizationComponent university = new University("清华大学", " 中国顶级大学 ");
		
		//创建 学院
		OrganizationComponent computerCollege = new College("计算机学院", " 计算机学院 ");
		OrganizationComponent infoEngineercollege = new College("信息工程学院", " 信息工程学院 ");
				
		//创建各个学院下面的系(专业)
		computerCollege.add(new Department("软件工程", " 软件工程不错 "));
		computerCollege.add(new Department("网络工程", " 网络工程不错 "));
		computerCollege.add(new Department("计算机科学与技术", " 计算机科学与技术是老牌的专业 "));
		
		//
		infoEngineercollege.add(new Department("通信工程", " 通信工程不好学 "));
		infoEngineercollege.add(new Department("信息工程", " 信息工程好学 "));
		
		//将学院加入到 学校
		university.add(computerCollege);
		university.add(infoEngineercollege);
		
		//university.print();
		infoEngineercollege.print();
	}

}

OrganizationComponent .java

public abstract class OrganizationComponent {
    
    

	private String name; // 名字
	private String des; // 说明
	
	protected  void add(OrganizationComponent organizationComponent) {
    
    
		//默认实现
		throw new UnsupportedOperationException();
	}
	
	protected  void remove(OrganizationComponent organizationComponent) {
    
    
		//默认实现
		throw new UnsupportedOperationException();
	}

	//构造器
	public OrganizationComponent(String name, String des) {
    
    
		super();
		this.name = name;
		this.des = des;
	}

	public String getName() {
    
    
		return name;
	}

	public void setName(String name) {
    
    
		this.name = name;
	}

	public String getDes() {
    
    
		return des;
	}

	public void setDes(String des) {
    
    
		this.des = des;
	}
	
	//方法print, 做成抽象的, 子类都需要实现
	protected abstract void print();
		
}

大学.java

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

//University 就是 Composite , 可以管理College
public class University extends OrganizationComponent {
    
    

	List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();

	// 构造器
	public University(String name, String des) {
    
    
		super(name, des);
		// TODO Auto-generated constructor stub
	}

	// 重写add
	@Override
	protected void add(OrganizationComponent organizationComponent) {
    
    
		// TODO Auto-generated method stub
		organizationComponents.add(organizationComponent);
	}

	// 重写remove
	@Override
	protected void remove(OrganizationComponent organizationComponent) {
    
    
		// TODO Auto-generated method stub
		organizationComponents.remove(organizationComponent);
	}

	@Override
	public String getName() {
    
    
		// TODO Auto-generated method stub
		return super.getName();
	}

	@Override
	public String getDes() {
    
    
		// TODO Auto-generated method stub
		return super.getDes();
	}

	// print方法,就是输出University 包含的学院
	@Override
	protected void print() {
    
    
		// TODO Auto-generated method stub
		System.out.println("--------------" + getName() + "--------------");
		//遍历 organizationComponents 
		for (OrganizationComponent organizationComponent : organizationComponents) {
    
    
			organizationComponent.print();
		}
	}

}

大学.java

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

public class College extends OrganizationComponent {
    
    

	//List 中 存放的Department,构建容器
	List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();

	// 构造器
	public College(String name, String des) {
    
    
		super(name, des);
		// TODO Auto-generated constructor stub
	}

	// 重写add
	@Override
	protected void add(OrganizationComponent organizationComponent) {
    
    
		// TODO Auto-generated method stub
		//  将来实际业务中,Colleage 的 add 和  University add 不一定完全一样
		organizationComponents.add(organizationComponent);
	}

	// 重写remove
	@Override
	protected void remove(OrganizationComponent organizationComponent) {
    
    
		// TODO Auto-generated method stub
		organizationComponents.remove(organizationComponent);
	}

	@Override
	public String getName() {
    
    
		// TODO Auto-generated method stub
		return super.getName();
	}

	@Override
	public String getDes() {
    
    
		// TODO Auto-generated method stub
		return super.getDes();
	}

	// print方法,就是输出University 包含的学院
	@Override
	protected void print() {
    
    
		// TODO Auto-generated method stub
		System.out.println("--------------" + getName() + "--------------");
		//遍历 organizationComponents 
		for (OrganizationComponent organizationComponent : organizationComponents) {
    
    
			organizationComponent.print();
		}
	}


}

部門.java

public class Department extends OrganizationComponent {
    
    

	//没有集合
	
	public Department(String name, String des) {
    
    
		super(name, des);
		// TODO Auto-generated constructor stub
	}

	
	//add , remove 就不用写了,因为他是叶子节点
	
	@Override
	public String getName() {
    
    
		// TODO Auto-generated method stub
		return super.getName();
	}
	
	@Override
	public String getDes() {
    
    
		// TODO Auto-generated method stub
		return super.getDes();
	}
	
	@Override
	protected void print() {
    
    
		// TODO Auto-generated method stub
		System.out.println(getName());
	}

}

JDKコレクションの複合モードのソースコード分析

  1. Javaのコレクションクラス-HashMapは結合モードを使用します

  2. コード分​​析+デバッグソースコード
    ここに画像の説明を挿入
    マップクラスとハッシュマップクラスはマップを継承し、インターフェイスします。haspmapはこのようにマップに集約されます

  3. クラス図
    ここに画像の説明を挿入

組み合わせモードの注意事項と詳細

  1. クライアントの操作を簡素化します。クライアントは、パーツ全体またはノードリーフを考慮せずに、一貫性のあるオブジェクトに直面するだけで済みます。

  2. 強力なスケーラビリティを備えています。複合オブジェクトを変更する場合は、内部の階層関係を調整するだけでよく、クライアントは変更を加える必要がありません。

  3. 複雑な階層構造の作成を容易にします。クライアントは組み合わせの構成の詳細を気にしません。ノードやリーフを追加して複雑な
    ツリー構造を作成するのは簡単です。

  1. 組織をトラバースする必要がある場合、または処理されたオブジェクトがツリー構造である場合は、結合モードを使用するのが非常に適しています。
  1. 高レベルの抽象化が必要です、多くのメソッドや属性が異なるなど、ノードとリーフの間に多くの違いがある場合は、複合モードを使用するのは適切ではありません。

総括する

クラスは、共通の親インターフェイスを介して集約されます

おすすめ

転載: blog.csdn.net/weixin_46168350/article/details/111056131