非官方解讀組合模式
標簽: 設計模式
組合模式(Composite) : 組合模式有時又叫部分-整體模式在處理類似樹形結構的問題時比較方便
使用場景:將多個對象組合在一起進行操作,常用于表示樹形結構中
作者是個二吊子,如果描述有誤請指出.
使用場景
我們可能會操作到一些屬性結構的數據,常見的是省市區,多級菜單.它們會具有較多的類似行為(方法).在這個時候我們常見的操作是進行多級菜單定義或者通用一個類來做.如果進行多級菜單定義可能會導致類爆炸.通用一個類的話就可能是靈活度不高,比如有少數方法的差異性處理是做不到的.后期擴展會很麻煩.以此引出組合模式.
組合模式
uml圖
這里我們用大學,學院,系來進行距離,網上通用模板
OrganizationComponent : 抽象接口,提供公共的操作方法,用于訪問和管理子部件
Department: 葉子結點,沒有子節點了,作為最底層
College,University: 容器對象義有枝節點行為,用來存儲子部件,在OrganizationComponent 接口中實現與子部件通用操作
/**
* @Description: 抽象類根級
* @Author: gaofan
* @Date: 2020/3/23 13:52
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public abstract class OrganizationComponent {
private String name;
private String desc;
protected void add(OrganizationComponent organizationComponent) {
throw new UnsupportedOperationException("不支持操作");
}
protected void remove(OrganizationComponent organizationComponent) {
throw new UnsupportedOperationException("不支持操作");
}
protected abstract void print();
public OrganizationComponent(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
/**
* @Description: 學院,容器對象-非葉子節點
* @Author: gaofan
* @Date: 2020/3/23 14:02
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class College extends OrganizationComponent{
List<OrganizationComponent> organizationComponentList = new ArrayList<>();
public College(String name, String desc) {
super(name, desc);
}
@Override
protected void add(OrganizationComponent organizationComponent) {
organizationComponentList.add(organizationComponent);
}
@Override
protected void remove(OrganizationComponent organizationComponent) {
organizationComponentList.remove(organizationComponent);
}
@Override
protected void print() {
System.out.println("-------次頂層--------"+getName() + "------------");
for(OrganizationComponent organizationComponent: organizationComponentList){
organizationComponent.print();
}
}
}
/**
* @Description: 大學,容器對象-非葉子節點
* @Author: gaofan
* @Date: 2020/3/23 13:56
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class University extends OrganizationComponent {
List<OrganizationComponent> organizationComponentList = new ArrayList<>();
public University(String name, String desc) {
super(name, desc);
}
@Override
protected void add(OrganizationComponent organizationComponent) {
organizationComponentList.add(organizationComponent);
}
@Override
protected void remove(OrganizationComponent organizationComponent) {
organizationComponentList.remove(organizationComponent);
}
@Override
protected void print() {
System.out.println("-------頂層--------"+getName() + "------------");
for(OrganizationComponent organizationComponent: organizationComponentList){
organizationComponent.print();
}
}
}
/**
* @Description: 系
* @Author: gaofan
* @Date: 2020/3/23 14:05
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class Department extends OrganizationComponent {
public Department(String name, String desc) {
super(name, desc);
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDesc() {
return super.getDesc();
}
@Override
protected void print() {
System.out.println("----葉子節點--------"+getName() + "------------");
}
}
/**
* @Description: TODO
* @Author: gaofan
* @Date: 2020/3/23 14:07
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class Client {
public static void main(String [] args){
OrganizationComponent university = new University("宜賓學院", "中國次頂級學校");
OrganizationComponent college = new College("物理與電子工程學院","老學院");
OrganizationComponent college1 = new College("經管學院","新學院");
college.add(new Department("電子信息工程","還行"));
college.add(new Department("物理系","不錯"));
college1.add(new Department("國際貿易","一般"));
college1.add(new Department("財經貿易","不知道"));
university.add(college);
university.add(college1);
university.print();
}
}
類型: 組合模式
原理: 樹形結構具有較多通用方法時可用于此類.減少使用繼承的手法之一.通過定義接口或者抽象類對容器對象,葉子對象行為(方法)進行抽象,可根據各自行為自行實現(差異化).容器對象通過組合的方式持有容器對象或者葉子對象.對其進行操作.
優點: 減少耦合性,復用性增強,靈活性較強
本文借鑒尚硅谷Java設計模式,韓順平圖解java,傳送門
智能推薦
YEOMAN官方文檔非官方翻譯~快速使用(codelab)
在25分鐘的 codelab(編碼實驗) 中,你將在 Yeoman、FountainJS 的幫助下,通過腳手架構建起一個功能完整的web應用。這個簡單的應用將會用 React、Angular2、Angular1 來編寫。 不知道 React 或者 Angular?沒關系,我們將會幫您渡過難關。然而,我們必須假定你先前已經有了一些 JavaScript 的編程經驗。 通過Yeoman構建這個簡單的應...
Qt 圖像疊加模式[composition Modes]官方例子 源碼解讀
前言: 看 qt 的例子 看到個有意思的 圖片質量有壓縮 看起來不美 這個代碼 比我們平常看到的要復雜一點 能學到東西 我把源碼看了一下 在這里在仔細整理說一下 composition 項目結構 一個 shared 文件夾 幾個類 注意 這個 hoverpoints 類沒有用到 因為我沒有開啟 opengl 兩個資源文件 一些美化控件的圖片 兩種 底色圖片 就是那個背景花 一個 html 里面是介...
SpringBoot非官方教程 | 第十九篇: 驗證表單信息
轉載請標明出處: http://blog.csdn.net/forezp/article/details/71023817 本文出自方志朋的博客 這篇文篇主要簡述如何在springboot中驗證表單信息。在springmvc工程中,需要檢查表單信息,表單信息驗證主要通過注解的形式。 構建工程 創建一個springboot工程,由于用到了 web 、thymeleaf、validator、el,引入...
SpringBoot非官方教程 | 第十二篇:springboot集成apidoc
轉載請標明出處: http://blog.csdn.net/forezp/article/details/71023579 本文出自方志朋的博客 首先聲明下,apidoc是基于注釋來生成文檔的,它不基于任何框架,而且支持大多數編程語言,為了springboot系列的完整性,所以標了個題。 一、apidoc簡介 apidoc通過在你代碼的注釋來生成api文檔的。它對代碼沒有侵入性,只需要你寫好相關的...
SpringBoot非官方教程 | 第十七篇:上傳文件
from:https://blog.csdn.net/forezp/article/details/71023752 這篇文章主要介紹,如何在springboot工程作為服務器,去接收通過http 上傳的multi-file的文件。 構建工程 為例創建一個springmvc工程你需要spring-boot-starter-thymeleaf和 spring-boot-starter-web的起步依...
猜你喜歡
SpringBoot非官方教程 | 第十二篇:springboot集成apidoc
from:https://blog.csdn.net/forezp/article/details/71023579 首先聲明下,apidoc是基于注釋來生成文檔的,它不基于任何框架,而且支持大多數編程語言,為了springboot系列的完整性,所以標了個題。 一、apidoc簡介 apidoc通過在你代碼的注釋來生成api文檔的。它對代碼沒有侵入性,只需要你寫好相關的注釋即可,并且它僅通過寫簡單...
樹莓派4安裝ubuntu mate(非官方版本)
樹莓派4安裝ubuntu mate(非官方版本) 樹莓派4安裝ubuntu mate(非官方版本) 1. 燒錄鏡像 2. 修改配置文件,固定IP地址 3. 開機 4. 配置網絡 1. 燒錄鏡像 鏡像文件的網址 點擊圖示處下載鏡像文件。這里建議選擇右側的完整桌面版本。 下載完成后將鏡像文件燒錄到準備好的SD卡上。 2. 修改配置文件,固定IP地址 經過我個人嘗試,此鏡像燒錄完成后無法直接開機。需要對...
SpringBoot非官方教程 | 第十七篇:上傳文件
版權聲明:本文為博主原創文章,歡迎轉載,轉載請注明作者、原文超鏈接 ,博主地址:http://blog.csdn.net/forezp。 轉載請標明出處: http://blog.csdn.net/forezp/article/details/71023752 本文出自方志朋的博客 這篇文章主要介紹,如何在springboot工程作為服務器,去接收通過http 上傳的mul...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...