1. 程式人生 > >結構型模式之——組合模式

結構型模式之——組合模式

結構型模式之 組合模式

前言

對於樹形結構,在程式碼中有容器節點和葉子節點之分,容器節點可以有子節點,而葉子節點沒有,所以兩者是有區分的,而在實際使用中,我們更希望一致的對待他們,因為如若區別對待,在程式上會非常複雜。組合模式則是為了解決此類問題而生的,它可以讓葉子物件和容器物件的使用具有一致性。他是組合多個物件形成樹形結構以表示具有“整體—部分”關係的層次結構,故稱為組合模式(這個是我猜的……)。

模式定義

組合模式(Composite Pattern):組合多個物件形成樹形結構以表示具有“整體—部分”關係的層次結構。組合模式對單個物件(即葉子物件)和組合物件(即容器物件)的使用具有一致性,組合模式又可以稱為“整體—部分”(Part-Whole)模式,它是一種物件結構型模式。
在組合模式中引入了抽象構件類Component,它是所有容器類和葉子類的公共父類,客戶端針對Component進行程式設計。

模式結構

Component 抽象構件,葉子構件和容器構件的介面或抽象類

Leaf 葉子構件,葉子節點沒有子節點

Composite 容器構件,容器節點可以有子節點,子節點也可以是容
器構件。

UML類圖

適用場景

在以下情況下可以使用組合模式:

1 在具有整體和部分的層次結構中,希望通過一種方式忽略整體與部分的差異,客戶端可以一致地對待它們。
2 在一個使用面嚮物件語言開發的系統中需要處理一個樹形結構。
3 在一個系統中能夠分離出葉子物件和容器物件,而且它們的型別不固定,需要增加一些新的型別。

看看大神怎麼用

組合模式使用面向物件的思想來實現樹形結構的構建與處理,描述瞭如何將容器物件和葉子物件進行遞迴組合,實現簡單,靈活性好。由於在軟體開發中存在大量的樹形結構,因此組合模式是一種使用頻率較高的結構型設計模式,Java SE中的AWT和Swing包的設計就基於組合模式,在這些介面包中為使用者提供了大量的容器構件(如Container)和成員構件(如Checkbox、Button和TextComponent等)

高清有碼

前戲:我們就Android的UI做一個簡單的例子,介面控制元件分為兩大類:View和ViewGroup。View是單元控制元件,如TextView,ImageView。ViewGroup是容器節點,如LinearLayout…我們用組合模式來設計這個庫。
正文開始,未滿18歲的可以離場了。

Demo角色預覽:

AbstractView 控制元件節點介面

ViewGroup 容器節點父類

View 子節點父類

LinearLayout 父節點實現類

RelativeLayout 父節點實現類

TextVeiw 子節點實現類

ImageView

子節點實現類

AbstractView

/**
 * 控制元件抽象類
 * Created by R on 2016/8/17.
 */
public interface AbstractView {

    void addView(AbstractView view);

    void removeView(AbstractView view);

    void show();

}

View

/**
 * 子控制元件的父類
 * Created by R on 2016/8/18.
 */
public abstract class View implements AbstractView{

    String id;

    public View(String id){
        this.id = id;
    }

    @Override
    public void addView(AbstractView view) {
        System.out.println("該控制元件不支援此方法");
    }

    @Override
    public void removeView(AbstractView view) {
        System.out.println("該控制元件不支援此方法");
    }

}

ViewGroup

/**
 * 容器控制元件的父類
 * Created by R on 2016/8/18.
 */
public abstract class ViewGroup implements AbstractView{

    String id;

    public ViewGroup(String id){
        this.id = id;
    }

    protected LinkedList<AbstractView> mChilds = new LinkedList<>();

    @Override
    public void addView(AbstractView view) {
        mChilds.add(view);
    }

    @Override
    public void removeView(AbstractView view) {
        mChilds.remove(view);
    }

}

LinearLayout

/**
 * Created by R on 2016/8/18.
 */
public class LinearLayout extends ViewGroup{

    public LinearLayout(String id) {
        super(id);
    }

    @Override
    public void show() {
        System.out.println("線性佈局容器:" + id + " 顯示");
        for (AbstractView mChild : mChilds) {
            mChild.show();
        }
    }
}

RelativeLayout

/**
 * Created by R on 2016/8/18.
 */
public class RelativeLayout extends ViewGroup{

    public RelativeLayout(String id) {
        super(id);
    }

    @Override
    public void show() {
        System.out.println("相對佈局容器:" + id + " 顯示");
        for (AbstractView mChild : mChilds) {
            mChild.show();
        }
    }
}

TextView

/**
 * Created by R on 2016/8/18.
 */
public class TextView extends View{

    public TextView(String id) {
        super(id);
    }

    @Override
    public void show() {
        System.out.println("文字控制元件:" + id + " 顯示");
    }
}

ImageView

/**
 * Created by R on 2016/8/18.
 */
public class ImageView extends View{

    public ImageView(String id) {
        super(id);
    }

    @Override
    public void show() {
        System.out.println("圖片控制元件:" + id + " 顯示");
    }
}

Client 使用

/**
 * Created by R on 2016/8/17.
 */
public class Client {

    public void main(){
        AbstractView view1 , view2 , view3, view4 , view5 , view6 , viewGroupRoot, viewGroup2, viewGroup3;

        viewGroupRoot = new LinearLayout("根佈局");
        viewGroup2 = new RelativeLayout("容器1");
        viewGroup3 = new LinearLayout("容器2");

        view1 = new TextView("文字1");
        view2 = new TextView("文字2");
        view3 = new TextView("文字3");
        view4 = new ImageView("圖片1");
        view5 = new ImageView("圖片2");
        view6 = new ImageView("圖片3");

        viewGroupRoot.addView(view1);
        viewGroupRoot.addView(viewGroup2);
        viewGroupRoot.addView(viewGroup3);

        viewGroup2.addView(view2);
        viewGroup2.addView(view3);

        viewGroup3.addView(view4);
        viewGroup3.addView(view5);
        viewGroup3.addView(view6);

        viewGroup3.removeView(view6);

        viewGroupRoot.show();
    }
}

輸出:

輸出內容

總結

樹形結構由容器節點和葉子節點組成,簡單來說組合模式就是將容器節點和葉子節點轉化為一種節點來使用的設計模式,這樣一來便可將精力更專注於樹的結構,而不是節點的型別上了。
據我不成熟的猜想,Android中的View系列就用到了組合模式,並且用的淋漓盡致。所有View都是節點,View就是View和ViewGroup的Component,只不過他不是抽象類或介面。而我們在構件介面的時候並不是特別關注節點的型別,而是節點之間的關係。並且在Touch事件中尤為明顯,Touch事件可以針對某一個節點,也可以針對某一節點之下的所有節點。

感謝

相關推薦

結構模式組合模式

新的 http getch branch oot 調用 block 工業 等級 組合模式也叫合成模式,用來描述部分與整體的關系。 定義: 將對象組合成樹形結構以表示“部分-整體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。 組合模式類圖如下所示。 組合模

設計模式組合模式(結構)

文章目錄 模式意圖 模式定義 模式角色 模式分析 實際例子 模式應用 模式意圖 介紹模式定義定義之前先介紹一下組合模式的意圖。其實就是將物件組合成整體-部

結構模式——組合模式

結構型模式之 組合模式 前言 對於樹形結構,在程式碼中有容器節點和葉子節點之分,容器節點可以有子節點,而葉子節點沒有,所以兩者是有區分的,而在實際使用中,我們更希望一致的對待他們,因為如若區別對待,在程式上會非常複雜。組合模式則是為了解決此類問

結構模式組合模式:防毒系統

一、題目設計一款防毒軟體,客戶可以直接對檔案(ImageFile和TextFile)進行防毒也可以對某個指定資料夾(ImageFolder和TextFolder)下的檔案進行防毒。java實現Interface介面:public interface Interface {vo

設計模式組合模式(構建)

目錄 模式意圖 模式定義 模式角色 模式分析 實際例子 模式應用 模式意圖 介紹模式定義定義之前先介紹一下組合模式的意圖。其實就是將物件組合成整體-部分層次的樹形結構,客戶端呼叫時,對於呼叫容器物件或者說組合物件("樹枝")和單個物件("樹葉")是一致的。 模式定義 組

設計模式組合模式

asp fast 基本 class prototype getch pro 通用 -i 設計模式之組合模式 Oct 19, 2015 組合模式(Composite)將對象組合成樹形結構以表示“部分-整體”的層次結構,組合模式使得用戶對單個對象和組合對象的使用具有一致性。

漫談設計模式組合模式

設計模式 組合模式一、什麽是設計模式、為什麽要使用它 對設計模式的解釋有很多,在這裏我按個人的理解闡述一下。設計模式就是一些常見問題的優秀實踐,一套按面向接口嚴格實現的優秀方法,是經過實踐認證的、高效的、解耦的解決方案。那麽為什麽要使用它,一個設計模式定義了一個問題、定義了一個解決方案、是經過測試的、能

設計模式組合模式 Composite

new private none 結點 strac protected () ati osi 代碼實現 //Component(抽象構件):抽象構件中定義了葉子和容器構件的共同點。比如,有公共的添加刪除葉子功能,有顯示節點功能。 public abstrac

GOF23設計模式組合模式(composite)

ret blog 構建 樹狀結構 遍歷 合成 str 管理 rri 一、組合模式概述   將對象組合成樹狀結構以表示“部分和整體”層次結構,使得客戶可以統一的調用葉子對象和容器對象。   (1)組合模式的使用場景      把部分和整體的關系用樹形結構來表示,從而使客戶端

2018.4.20 設計模式組合模式

部分 葉子節點 方法 簡化 客戶端 抽象類 子節點 4.2 概念 什麽是組合模式? 組合模式是指將對象組合成樹形結構以表示“部分-整體”的層次結構,組合模式使得用戶對單個對象和組合對象的使用具有一致性。 有時候又叫做部分-整體模式,是用於把一組相似的對象當作一

C++設計模式組合模式

層次 concrete 鏈表 show 中間 圖片 push_back 用戶 tchar DP書上給出的定義:將對象組合成樹形結構以表示“部分-整體”的層次結構。組合使得用戶對單個對象和組合對象的使用具有一致性。註意兩個字“樹形”。這種樹形結構在現實生活中隨處可見,比如一個

設計模式的藝術 結構性模式組合模式

不懂使用為學過,說出用途,繪製結構為了解,不會靈活使用基本等於沒學。 前言 樹形結構在軟體中隨處可見,比如系統中的目錄結構,應用軟體中的選單,如何運用面向物件的方式來處理這種樹形結構是組合模式需要解決的問題。組合模式通過一種巧妙的設計方案來使得使用者可以一致性的處理整個樹形結構或者樹形結構的

設計模式組合模式

設計模式之組合模式三 六、享元模式 七、外觀模式 六、享元模式 核心: 1)享元模式以共享的方式高效的支援大量細粒度物件的重用 2)享元模式物件能做到共享的關鍵是區分了內部狀態和外部狀態 內部狀態:可以共享,不會隨環境變化而變化 外部狀態:不可以共享,會隨環境變化而變化

設計模式組合模式(Composite Pattern)

組合模式(Composite Pattern),又叫部分整體模式,是用於把一組相似的物件當作一個單一的物件。組合模式依據樹形結構來組合物件,用來表示部分以及整體層次。這種型別的設計模式屬於結構型模式,它建立了物件組的樹形結構。 介紹 意圖:將物件組合成樹形結構以表示"部分-整體"的層次結構。

每天一個設計模式組合模式

作者按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前採用javascript和python兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :) 原文地址是:《每天一個設計模式之組合模式》 歡迎關注個人技術部落格:godbmw.com。每週 1 篇原創

23種設計模式組合模式

組合模式的定義 定義: 將物件組合成樹形結構以表示 "部分-整體" 的層次結構,使得使用者對單個物件和組合物件的使用具有一致性. 通俗的說, 就是實現了樹形結構 通用類圖如下:   其中的三個角色如下: Component 抽象構件角色: 定義參加組合物件的共有方法和

android設計模式組合模式

組合模式(Composite Pattern)也稱為部分整體模式(Part-Whole Pattern),結構型設計模式之一,組合模式比較簡單,它將一組相似的物件看做一個物件處理,並根據一個樹狀結構來組合物件,然後提供一個統一的方法去訪問相應的物件,以此忽略掉物件與物件集合之間的差別。 組合模式

設計模式組合模式——Java語言描述

組合模式又叫做部分整體模式,適用於把一組相似的物件當作一個單一的物件。組合模式依據樹形結構來組合物件,用來表示部分以及整體層次 介紹 意圖 將物件組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性 優點 高層模組呼叫簡單 節點自由

設計模式組合模式&享元模式

設計模式之組合模式 組合模式概念 將n個物件組合成一個樹形結構,目的是用來表示整體和區域性的層次,使得使用者對單個物件和組合物件的使用有一個整體的一致性 應用場景 需要凸顯整體和區域性關係的時候,需要使用組合模式 一個功能模組要求可以從整體獨立

java設計模式組合模式Composite

Composite定義:  將物件以樹形結構組織起來,以達成“部分-整體” 的層次結構,使得客戶端對單個物件和組合物件的使用具有一致性.    Composite比較容易理解,想到Composite就應該想到樹形結構圖。組合體內這些物件都有共同介面,當組合體一個物件的方法