1. 程式人生 > >Java設計模式8:組合模式(Composite)

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輸入輸出11IO流FileOutputStream

FileOutputStream(String str)在建立物件的時候沒有這個檔案會建立該檔案,如果有這個檔案就會將其清空。 package filePackage; import java.io.F

JAVA虛擬機器之一垃圾回收GC機制

引言 java對於其它語言(c/c++)來說,建立一個物件使用後,不用顯式的delete/free,且能在一定程度上保證系統記憶體資源及時回收,這要功歸於java的自動垃圾回收機制(Garbage Collection,GC),但也是因為自動回收機制存在,一旦系統內洩漏或存

【LeetCode & 劍指offer刷題】動態規劃與貪婪法題8House 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查詢的結果合併成一個結果

RTMPdumplibRTMP 原始碼分析 8 傳送訊息Message

=====================================================RTMPdump(libRTMP) 原始碼分析系列文章:=====================================================函式呼叫