iT邦幫忙

2021 iThome 鐵人賽

DAY 13
1

  今天要來介紹Composite Pattern,是屬於Structural Design Pattern的其中之一,現在就來認識一下吧!


問題情境與解析

  假設現在有兩種類型的物件,一個是物品、一個是包裝盒,而包裝盒中還可以容納小的包裝盒和一些物品,有點類似俄羅斯娃娃的樣子。若要檢查裡面所有物品總價是多少,就必須要打開所有大小的包裝盒來計數。

  在現實生活中,這方法看起來非常理所當然,不過在程式中,要這樣運作就必須先知道盒子的類別,還要經歷其繁瑣的過程才能達到目的,這會顯得程式看起來非常笨拙。

  而Composite模式會宣告一組物件,這些物件(物品、小包裝盒)會有個共同的介面,這介面提供了一個計算總價的方法,若是物品就會回傳該物品的價格;若是小盒子就會去遍歷其內部組件的所有物品,並回傳所有東西的總價。

  用這樣的一種方式來達到不需要你要傳遞資訊的對象是一個物件還是小盒子,只要透過它們共同的介面,將它們一視同仁,在調用其方法的時候,物件本身就會將請求向下傳遞到各個節點中,做子結點自己該做的事情!就好比分配一個任務到主管身上,而主管就會去組織他的團隊,向下布達本次任務,再由每個人各司其職,來完成團隊任務!

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20210928/20140743hvqnst0YbX.png

Skeleton Code

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

interface Component {
    public void execute();
}

class Leaf implements Component {
	private Type field;
	
    public Leaf(Type field) {
        this.field = field;
    }

    public void execute()
    {
        // Do some Work
    }
}

class Composite implements Component {
    private List<Component> children = new ArrayList<Component>();

    public void execute() {
        for(Component kid:children) {
            kid.execute();
        }
    }
			
    public void addComponent(Component kid) {
        children.add(kid);
    }

    public void removeComponent(Component kid) {
        children.remove(kid);
    }
}

  使用Composite Pattern就可以很方便的使用複雜的樹狀結構,透過共同的介面來完成複雜的任務,若要新增新的物件到程式碼中,也可以不用修改主程式就能夠新增樹狀結構的新結點了,是不是很方便呢!


除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章

lu23770127 - SASS 基礎初學三十天

10u1 - 糟了!是世界奇觀!

juck30808 - Python - 數位行銷分析與 Youtube API 教學

SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?


上一篇
IT鐵人DAY 12-Prototype 原型模式
下一篇
IT鐵人DAY 14-Decorator 裝飾者模式
系列文
淺談物件導向與Design Pattern介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言