Head First 設計模式 —— 11. 組合 (Composite) 模式

思考題

咱們不單單要支持多個菜單,甚至還要支持菜單中的菜單。你如何處理這個新的設計需求? P355java

  • 【提示】在咱們的新設計中,真正須要如下三點: P354
    • 咱們須要某種屬性結構,能夠容納菜單、子菜單和菜單項
    • 咱們須要肯定可以在每一個菜單的各個項之間遊走,並且至少要像如今用迭代器同樣方便
    • 咱們也須要可以更有彈性地在菜單項之間遊走。比方說,可能只須要遍歷甜點菜單,或者能夠遍歷餐廳的整個菜單(包括甜點菜單在內)
  • 提供一個接口,統一菜單和菜單項的超類
    • 接口包含菜單和菜單項的共同方法,菜單中執行方法是依次執行每一個子項中的相同方法
    • 接口包含菜單特有的增刪改查子項的方法,菜單項中的增刪改查子項的方法實現爲直接拋出 UnsupportedOperationException
    • 能夠經過 instanceof 判斷當前項是菜單仍是菜單項

組合模式

容許你將對象組合成樹形結構來表現」總體/部分「層次結構。組合能讓客戶以一致的方式處理個別對象以及對象組合。
組合模式git

特色github

  • 把相同的操做應用在組合和個別對象上,便可以忽略對象組合和個別對象之間的差異 P357
  • 以違反單一職責設計原則換取透明性,即不但要管理層次結構,還要同時包含管理組合和葉節點的操做,以將組合和葉節點一視同仁 P367

空迭代器:空對象(命令模式中提到過)的一個例子。空迭代器, hasNext() 永遠返回 falsenext() 永遠返回 null (我的以爲能夠拋出 NoSuchElementException), remove() 永遠拋出 UnsupportedOperationExceptionP372ide

思考題

public class Waitress {
    MenuComponent allMenus;
    
    public Waitress(MenuComponent allMenus) {
        this.allMenus = allMenus;
    }
    
    public void printMenu() {
        allMenus.print();
    }
    
    public void printVegetarianMenu() {
        Iterator iterator = allMenus.createIterator();
        System.out.println("\nVEGETARIAN MENU\n----");
        while (iterator.hasNext()) {
            MenuComponent menuComponent = (MenuComponent)iterator.next();
            try {
                if (menuComponent.isVegetarian()) {
                    menuComponent.print();
                }
            } catch (UnsupportedOperationException e) {}
        }
    }
}

printVegetarianMenu() 方法中只有菜單項的 print() 方法能夠被調用,絕對不能調用菜單(組合)的 print() 方法。你能說出緣由嗎? P373this

  • 使用迭代器遍歷時已經會遍歷全部的節點(包括組合節點和葉節點),而組合節點會打印全部子節點信息,若是調用組合節點的 print() ,則一定會重複打印某些葉節點。

思考題

配對下列模式和描述: P379
策略模式:封裝可互換的行爲,並使用委託決定使用哪個
適配器模式:改變一個或多個類的接口
迭代器模式:提供一個方式來遍歷集合,而無須暴露集合的實現
外觀模式:簡化一羣類的接口
組合模式:客戶能夠將對象的集合以及個別的對象一視同仁
觀察者模式:當某個狀態改變時,容許一羣對象能被通知到idea

所思所想

  • 之前在不少地方其實都用到了這種思想,二叉樹、trie 樹和線段樹等樹結構都容許將節點組成樹形結構來表現」總體/部分「的層次結構,而且提供了一致的方式處理非葉節點和葉節點(非葉節點的方法內部按照特定邏輯處理和調用子節點的相同方法)

本文首發於公衆號:滿賦諸機(點擊查看原文) 開源在 GitHub :reading-notes/head-first-design-patterns
設計

相關文章
相關標籤/搜索