Java設計模式8:組合模式(Composite)
組合模式(Composite)
意圖
將物件組合成樹形結構已表示“部分-整體”的層次結構。Composite使得使用者對單個物件和組合物件的使用具有一致性
適用性
1、你想表示物件的部分-整體層次i結構
2、你希望使用者忽略組合物件與單個休想的不同,使用者將統一地使用組合結構中的所有物件
結構
典型的Composite物件結構
Component
為組合的物件宣告介面
適當情況下,實現所有類共有介面的預設行為
宣告一個介面用於訪問和管理Component的子元件
在遞迴結構中定義一個介面,用於訪問一個父部件,並在合適的情況下實現
Leaf
在組合中表示葉節點物件,葉節點沒有子節點
在組合中定義圖元物件的行為
Composite
定義所有子部件的部件行為
儲存子部件
在Component介面中實現與子部件有關的操作
Client
通過Component介面操縱組合部件的物件
實現
既然說是像一個樹狀結構,首先想到的就是公司的部門架構,如下
Component
package composite;
/**
* @Author fitz.bai
* @Date 2018/8/29 20:59
*/
public abstract class Company {
private String name;
public Company () {
}
public Company(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
protected abstract void add(Company company);
protected abstract void remove(Company company);
protected abstract void display(int depth);
}
Composite
package composite;
import java.util.ArrayList;
import java.util.List;
/**
* @Author fitz.bai
* @Date 2018/8/29 21:01
*/
public class ConcreteCompany extends Company {
private List<Company> companyList;
public ConcreteCompany() {
companyList = new ArrayList<>();
}
public ConcreteCompany(String name) {
super(name);
companyList = new ArrayList<>();
}
@Override
protected void add(Company company) {
companyList.add(company);
}
@Override
protected void remove(Company company) {
companyList.remove(company);
}
@Override
protected void display(int depth) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < depth; i++) {
stringBuilder.append("-");
}
System.out.println(stringBuilder.toString() + this.getName());
for (Company c : companyList) {
c.display(depth + 2);
}
}
}
Leaf
package composite;
/**
* @Author fitz.bai
* @Date 2018/8/29 21:06
*/
public class OCDepartment extends Company {
public OCDepartment() {
}
public OCDepartment(String name) {
super(name);
}
@Override
protected void add(Company company) {
}
@Override
protected void remove(Company company) {
}
@Override
protected void display(int depth) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < depth; i++) {
sb.append("-");
}
System.out.println(new String(sb) + this.getName());
}
}
package composite;
/**
* @Author fitz.bai
* @Date 2018/8/29 21:06
*/
public class TechDepartment extends Company {
public TechDepartment() {
}
public TechDepartment(String name) {
super(name);
}
@Override
protected void add(Company company) {
}
@Override
protected void remove(Company company) {
}
@Override
protected void display(int depth) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < depth; i++) {
sb.append("-");
}
System.out.println(new String(sb) + this.getName());
}
}
Client
package composite;
/**
* @Author fitz.bai
* @Date 2018/8/29 20:58
*/
public class Client {
public static void main(String[] args) {
Company root = new ConcreteCompany("Fitz總公司");
root.add(new OCDepartment("OC部門"));
root.add(new TechDepartment("技術部門"));
Company shanghai = new ConcreteCompany("Fitz上海分公司");
shanghai.add(new OCDepartment("上海OC部門"));
shanghai.add(new TechDepartment("上海技術部門"));
Company yangpu = new ConcreteCompany("Fitz上海楊浦分公司");
yangpu.add(new OCDepartment("上海楊浦OC部門"));
yangpu.add(new TechDepartment("上海楊浦技術部門"));
root.add(shanghai);
root.add(yangpu);
root.display(0);
}
}
/**
Fitz總公司
--OC部門
--技術部門
--Fitz上海分公司
----上海OC部門
----上海技術部門
--Fitz上海楊浦分公司
----上海楊浦OC部門
----上海楊浦技術部門
*/
安全模式和透明模式
從上面的Compoent看出,我們把用來組合使用的方法都方法哦了抽象類中,不管是葉子物件還是樹枝物件都有相同的結構,這種方式叫做透明模式
安全模式就是在抽象元件中之定義一些預設的屬性和行為,把樹枝接點和葉子結點全部徹底分開,上面的例子,我們可以把Company類中只保留共有的display方法,而在ConcreteCompany中還可以有add和remove方法,具體到部門之後(例如OC department)是葉子結點,無法add和remove,因此只保留display方法,這就是安全模式
優點
1、清楚地表示分層次的複雜物件且增加刪除構件更容易。
2、葉子物件也可以被組合容器物件,容器物件又可以新增多個葉子物件,這樣不斷遞迴下去,可以形成表達複雜的樹形結構。
3、更容易在組合體內加入物件,客戶端不必因為加入了新的物件構件而更改原有程式碼。
缺點
增加新構件時,我們很難對容器中的構件型別進行限制。有時候我們希望一個容器中只能有某些特定型別的物件,例如在某個資料夾中只能包含文字檔案,使用組合模式時,不能依賴型別系統來施加這些約束,因為它們都來自於相同的抽象層,在這種情況下,必須通過在執行時進行型別檢查來實現,這個實現過程較為複雜。
相關推薦
Java設計模式8:組合模式(Composite)
組合模式(Composite) 意圖 將物件組合成樹形結構已表示“部分-整體”的層次結構。Composite使得使用者對單個物件和組合物件的使用具有一致性 適用性 1、你想表示物件的部分-整體層次i結構 2、你希望使用者忽略組合物件與單個休想的
Java設計模式8:外觀模式
一、外觀模式的定義: 外觀模式隱藏了系統的複雜性,並向客戶端提供了一個可以訪問系統的介面。這種型別的設計模式屬於結構性模式。為子系統中的一組介面提供了一個統一的訪問介面,這個介面使得子系統更容易被訪問或者使用。 二、外觀模式的結構: 1、外觀角色:外觀模式的核心。它
Java描述設計模式(10):組合模式
本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、生活場景 1、檔案系統 下圖是常見的計算機檔案系統的一部分。
設計模式系列:組合模式
○ 種一棵樹最好的時間是十年前,其次是現在 ○ 堅持輸出,堅持書寫,才可以持續成長 ○ 所有美好事物的成長都是緩慢的 ○ 既往不戀,未來不迎,當下不雜 ○ 業精於勤,荒於嬉,行成於思,毀於隨 ○將軍趕路 不追小兔 ○不要拘泥於語言,同樣也不要拘泥於行業,眼光放遠一點
《Head First 設計模式》:組合模式
# 正文 ## 一、定義 組合模式允許你將物件合成樹形結構來表現“整體/部分”層次結構。組合能讓客戶以一致的方式處理組合物件以及個體物件。 * 組合物件:包含其他元件的元件。 * 個體物件(葉節點物件):沒有包含其他元件的元件。 ![](https://img2020.cnblogs.com/blog
Silverlight & Blend動畫設計系列四:傾斜動畫(SkewTransform)
圖形 wid onu alt 文件 amp val 設計工具 現實生活 Silverlight中的傾斜變化動畫(SkewTransform)能夠實現對象元素的水平、垂直方向的傾斜變化動畫效果。我們現實生活中的傾斜變化效果是非常常見的,比如翻書的紙張效果,關門開門的時候門縫圖
Silverlight & Blend動畫設計系列一:偏移動畫(TranslateTransform)
gif 用戶 pre class 拖拽 width 新用戶 board 動畫效果 用戶界面組件、圖像元素和多媒體功能可以讓我們的界面生動活潑,除此之外,Silverlight還具備動畫功能,它可以讓應用程序“動起來”。實際上,英文中Animation這個單詞的意思是給某物帶
Silverlight & Blend動畫設計系列二:旋轉動畫(RotateTransform)
target width duration pac 操作 縮放 () rop pri Silverlight的基礎動畫包括偏移、旋轉、縮放、傾斜和翻轉動畫,這些基礎動畫毫無疑問是在Silverlight中使用得最多的動畫效果,其使用也是非常簡單的。相信看過上一篇《偏移動畫(
Silverlight & Blend動畫設計系列七:模糊效果(BlurEffect)與陰影效果(DropShadowEffect)
home 鼠標 color amp pos function soft mage double 原文:Silverlight & Blend動畫設計系列七:模糊效果(BlurEffect)與陰影效果(DropShadowEffect) 模糊效果(BlurEffec
Angular6學習筆記8: 服務(Service)(1)
服務(Service) 繼學習筆記7,可以使用主從元件,現在繼續學習(服務)Service; 問題:為什麼需要服務? 因為:元件不應該直接獲取或儲存資料,它們不應該瞭解是否在展示假資料。 它們應該聚焦於展示資料,而把資料訪問的職責委託給某個服務。 這次將建立一個 H
Java面試系列總結 :JavaSE高階(上)
1. 說說你對Java中反射的理解 Java 中的反射首先是能夠獲取到 Java 中要反射類的位元組碼,獲取位元組碼有三種方法,1.Class.forName(className) 2.類名.class 3.this.getClass()。然後將位元組碼中的方法,變數,建構函式等
Java面試系列總結 :JavaSE基礎(2) 常用 API
1. Math.round(11.5)等於多少?Math.round(- 11.5) 又等於多少? Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。 四捨五入的原理是在引數上加 0.5然後進行取整。 2.
Java面試系列總結 :JavaSE基礎(1) 面向物件/語法/異常
1. 面向物件都有哪些特性以及你對這些特性的理解 繼承:繼承是從已有類得到繼承資訊建立新類的過程。提供繼承資訊的類被稱為父類(超類、基類);得到繼承資訊的類被稱為子類(派生類)。繼承讓變化中的軟體系統有了一定的延續性,同時繼承也是封裝程式中可變因素的 重要
java輸入輸出11:IO流(FileOutputStream)
FileOutputStream(String str)在建立物件的時候沒有這個檔案會建立該檔案,如果有這個檔案就會將其清空。 package filePackage; import java.io.F
JAVA虛擬機器之一:垃圾回收(GC)機制
引言 java對於其它語言(c/c++)來說,建立一個物件使用後,不用顯式的delete/free,且能在一定程度上保證系統記憶體資源及時回收,這要功歸於java的自動垃圾回收機制(Garbage Collection,GC),但也是因為自動回收機制存在,一旦系統內洩漏或存
【LeetCode & 劍指offer刷題】動態規劃與貪婪法題8:House Robber(系列)
【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...) House Robber(系列) House Robber You are a professional robber
JAVA程式碼—演算法基礎:跳躍遊戲(II)
跳躍遊戲(Jump Game II) 問題描述: Given an array of non-negative integers, you are initially positioned at the first index of the array.
java多執行緒:ExecutorService解析(五)
前面幾篇部落格寫到的多執行緒實現基本都是顯式呼叫了Thread的start()方法,除了這種方法有沒有其他的實現方法呢,這裡我們來看下java.util.concurrent包下的Exe
MySQL必知必會:組合查詢(Union)
本篇文章主要介紹使用Union操作符將多個SELECT查詢組合成一個結果集。本文參考《Mysql必知必會》+工作實踐融合組合查詢定義在大多數開發中,使用一條SELECT查詢就會返回一個結果集。如果,我們想一次性查詢多條SQL語句,並將每一條SELECT查詢的結果合併成一個結果
RTMPdump(libRTMP) 原始碼分析 8: 傳送訊息(Message)
=====================================================RTMPdump(libRTMP) 原始碼分析系列文章:=====================================================函式呼叫