首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java設計模式深度解析:迭代器模式與適配器思想的完美結合

     編輯:Java 綜合教學

Java設計模式深度解析:迭代器模式與適配器思想的完美結合

迭代器模式不僅是遍歷集合的工具,更體現「組合優於繼承」的設計智慧。本文通過《Head First 設計模式》經典雙餐廳合併案例,展示如何統一 ArrayList 與數組兩種不同數據結構的遍歷方式。

場景背景:兩家餐廳菜單系統整合

  • 早餐店 A:菜單基於 ArrayList 實現
  • 午餐店 B:菜單基於數組 MenuItem[] 實現
  • 合併後需求:不修改原有實現,統一遍歷接口

核心設計:統一迭代器接口

迭代器模式類圖:Menu接口、BreakfastMenu/LunchMenu實現、Iterator統一遍歷
迭代器模式類結構:Menu接口定義createIterator(),具體菜單返回對應迭代器

1. 統一菜單接口

public interface Menu {
    public Iterator<MenuItem> createIterator();
}

2. 早餐菜單:直接利用 ArrayList 內建迭代器

public class BreakfastMenu implements Menu {
    private ArrayList<MenuItem> menuItems;
    @Override
    public Iterator<MenuItem> createIterator() {
        return menuItems.iterator(); // 直接復用集合迭代器
    }
}

3. 午餐菜單:為數組自定義迭代器 (適配器模式應用)

public class LunchMenu implements Menu {
    private MenuItem[] menuItems;
    @Override
    public Iterator<MenuItem> createIterator() {
        return new LunchIterator(menuItems); // 適配數組為迭代器
    }
}

public class LunchIterator implements Iterator<MenuItem> {
    private MenuItem[] menuItems;
    private int position = 0;
    
    public boolean hasNext() {
        return position < menuItems.length && menuItems[position] != null;
    }
    public MenuItem next() {
        return menuItems[position++];
    }
}

4. 客戶端統一遍歷邏輯 (服務員打印菜單)

public class Waitress {
    private Menu menu;
    public Waitress(Menu menu) { this.menu = menu; }
    public void printMenu() {
        Iterator<MenuItem> iterator = menu.createIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

模式優勢總結

  • 解耦:客戶端代碼與具體集合實現完全分離
  • 擴展性:新增菜單類型只需實現 Menu 接口,無需修改遍歷邏輯
  • 單一職責:遍歷邏輯封裝在迭代器中,菜單類專注數據管理
  • 適配器思想:為無迭代器的數組「適配」出統一接口

這就是迭代器模式的威力:為不同聚合對象提供統一遍歷介面,且不暴露內部結構。GitHub完整代碼:DesignPattern-Iterator

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved