国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

開發之路(設計模式十:迭代器模式上)

Thanatos / 1545人閱讀

摘要:感謝你看到這里,迭代器模式上部分到這里就結束了,本人文筆隨便,若有不足或錯誤之處望給予指點,度彎腰很快我會補全這個內容,生命不息,編程不止參考書籍設計模式

有許多種方法可以把對象堆起來成為一個集合

好消息,當地的餐廳和煎餅屋合并了,但是兩者實現的方式卻不同,這就造成了分歧。讓我們一起去看看把。

一個使用ArrayList集合,另一個使用數組實現,事情看起來確實棘手,我們創建一個女招待作為中間人來使用兩個菜單的客戶代碼

這里就有個問題,我們在打印早餐和午餐的時候由于使用對象不同,Arraylist和數組,這樣我們就要寫兩個for循環了,倘若后面還有新的對象加進來做晚餐呢?或許我們能想出一個辦法,讓他們的菜單實現一個相同的接口,我們是否可以試著封裝多個遍歷呢?步驟圖如下

OK,看來迭代器模式幫助了我們,迭代器(iterator)依賴于迭代器接口。相關類圖如下

想要在餐廳菜單中加入迭代器,我們先定義迭代器接口

package MenuItem;

/**
 * 迭代器接口
 * 
 * @author Joy
 * 
 */
public interface Iterator {
    // 知道是否還有更多元素
    boolean hasNext();

    // 返回下一個元素
    Object next();
}

然后先用DinerMenuIterator類去實現接口

package MenuItem;

/**
 * 實現迭代器
 * 
 * @author Joy
 * 
 */
public class DinerMenuIterator implements Iterator {
    MenuItem[] items;
    int position = 0;// 數組索引

    // 構造器初始化傳入一個菜單項的數組當參數
    public DinerMenuIterator(MenuItem[] items) {
        this.items = items;
    }

    // 返回數組下一項,索引自+1
    @Override
    public Object next() {
        MenuItem menuItem = items[position];
        position += 1;
        return menuItem;
    }

    // 判斷數組是否滿了
    @Override
    public boolean hasNext() {
        if (position >= items.length || items[position] == null) {
            return false;
        }
        return true;
    }
}

我們有了菜單迭代器,利用它改寫餐廳菜單,DineMenu類中這樣寫

package MenuItem;

/**
 * 對象村餐廳
 * 
 * @author Joy
 * 
 */
public class DineMenu {
    // 菜單總數
    static final int MAX_ITEMS = 6;
    // 菜單量
    int numberOfItems = 0;
    MenuItem[] menuItems;

    // 初始化數組,添加菜單內容
    public DineMenu() {
        menuItems = new MenuItem[MAX_ITEMS];
        addItem("素食BLT", "(煎)培根、生菜&西紅柿并用面包做", true, 2.99);
        addItem("BLT", "培根、生菜&西紅柿", false, 2.99);
        addItem("例湯", "一碗例湯、配土豆沙拉", false, 3.29);
        addItem("熱狗", "熱狗、酸菜、上蓋芝士", false, 3.29);
        addItem("清蒸時蔬加糙米", "清蒸的蔬菜配糙米", false, 3.05);

    }

    // 創建一個添加菜單方法
    public void addItem(String name, String description, boolean vegetarian,
            double price) {
        MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
        if (numberOfItems >= MAX_ITEMS) {
            System.out.println("抱歉,菜單已滿,不能添加菜單了");
        } else {
            // 菜單還沒滿還可以繼續添加
            menuItems[numberOfItems] = menuItem;
            numberOfItems += 1;
        }
    }

    // 使用迭代器遍歷菜單
    public Iterator createIterator() {
        return new DinerMenuIterator(menuItems);
    }
}

完整代碼如下

迭代器接口

package MenuItem;

/**
 * 迭代器接口
 * 
 * @author Joy
 * 
 */
public interface Iterator {
    // 知道是否還有更多元素
    boolean hasNext();

    // 返回下一個元素
    Object next();
}

菜單類

package MenuItem;

/**
 * 對象村餐廳
 * 
 * @author Joy
 * 
 */
public class DineMenu {
    // 菜單總數
    static final int MAX_ITEMS = 6;
    // 菜單量
    int numberOfItems = 0;
    MenuItem[] menuItems;

    // 初始化數組,添加菜單內容
    public DineMenu() {
        menuItems = new MenuItem[MAX_ITEMS];
        addItem("素食BLT", "(煎)培根、生菜&西紅柿并用面包做", true, 2.99);
        addItem("BLT", "培根、生菜&西紅柿", false, 2.99);
        addItem("例湯", "一碗例湯、配土豆沙拉", false, 3.29);
        addItem("熱狗", "熱狗、酸菜、上蓋芝士", false, 3.29);
        addItem("清蒸時蔬加糙米", "清蒸的蔬菜配糙米", false, 3.05);

    }

    // 創建一個添加菜單方法
    public void addItem(String name, String description, boolean vegetarian,
            double price) {
        MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
        if (numberOfItems >= MAX_ITEMS) {
            System.out.println("抱歉,菜單已滿,不能添加菜單了");
        } else {
            // 菜單還沒滿還可以繼續添加
            menuItems[numberOfItems] = menuItem;
            numberOfItems += 1;
        }
    }

    // 使用迭代器遍歷菜單
    public Iterator createIterator() {
        return new DinerMenuIterator(menuItems);
    }
}

餐廳的實現以及接口

package MenuItem;

/**
 * 實現迭代器
 * 
 * @author Joy
 * 
 */
public class DinerMenuIterator implements Iterator {
    MenuItem[] items;
    int position = 0;// 數組索引

    // 構造器初始化傳入一個菜單項的數組當參數
    public DinerMenuIterator(MenuItem[] items) {
        this.items = items;
    }

    // 返回數組下一項,索引自+1
    @Override
    public Object next() {
        MenuItem menuItem = items[position];
        position += 1;
        return menuItem;
    }

    // 判斷數組是否滿了
    @Override
    public boolean hasNext() {
        if (position >= items.length || items[position] == null) {
            return false;
        }
        return true;
    }
}
package MenuItem;

/**
 * 對象村餐廳
 * 
 * @author Joy
 * 
 */
public class DineMenu {
    // 菜單總數
    static final int MAX_ITEMS = 6;
    // 菜單量
    int numberOfItems = 0;
    MenuItem[] menuItems;

    // 初始化數組,添加菜單內容
    public DineMenu() {
        menuItems = new MenuItem[MAX_ITEMS];
        addItem("素食BLT", "(煎)培根、生菜&西紅柿并用面包做", true, 2.99);
        addItem("BLT", "培根、生菜&西紅柿", false, 2.99);
        addItem("例湯", "一碗例湯、配土豆沙拉", false, 3.29);
        addItem("熱狗", "熱狗、酸菜、上蓋芝士", false, 3.29);
        addItem("清蒸時蔬加糙米", "清蒸的蔬菜配糙米", false, 3.05);

    }

    // 創建一個添加菜單方法
    public void addItem(String name, String description, boolean vegetarian,
            double price) {
        MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
        if (numberOfItems >= MAX_ITEMS) {
            System.out.println("抱歉,菜單已滿,不能添加菜單了");
        } else {
            // 菜單還沒滿還可以繼續添加
            menuItems[numberOfItems] = menuItem;
            numberOfItems += 1;
        }
    }

    // 使用迭代器遍歷菜單
    public Iterator createIterator() {
        return new DinerMenuIterator(menuItems);
    }
}

同理煎餅屋的實現和接口

package MenuItem;

import java.util.ArrayList;

public class PancakeHouseIterator implements Iterator {
    ArrayList items;
    int position = 0;

    public PancakeHouseIterator(ArrayList items) {
        this.items = items;
    }

    @Override
    public Object next() {
        Object obj = items.get(position);
        position += 1;
        return obj;
    }

    @Override
    public boolean hasNext() {
        if (position >= items.size()) {
            return false;
        }
        return true;
    }
}
package MenuItem;

import java.util.ArrayList;

/**
 * 對象村煎餅屋菜單
 * 
 * @author Joy
 * 
 */
public class PancakeHouseMenu {
    ArrayList menuItems;

    public PancakeHouseMenu() {
        menuItems = new ArrayList();
        addItem("K&B薄煎餅早餐", "薄煎餅,清蛋和吐司", true, 2.99);
        addItem("薄煎餅早餐例餐", "薄煎餅,煎蛋和香腸", false, 2.99);
        addItem("藍莓薄煎餅", "新鮮藍莓和藍莓糖漿做成的薄煎餅", false, 3.49);
        addItem("松餅", "可以選擇藍莓或草莓", true, 3.59);        

    }

    // 創建一個添加菜單方法
    public void addItem(String name, String description, boolean vegetarian,
            double price) {
        // 菜單項對象,并加入到ArrayList里
        MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
        menuItems.add(menuItem);
    }

    //使用迭代器遍歷菜單
    public Iterator createIterator(){
        return new PancakeHouseIterator(menuItems);
    }
}

女招待的實現

package MenuItem;
/**
 * 對象村的女招待
 * 
 * @author Joy
 * 
 */
public class Waitress {
    //創建兩個餐廳對象的引用
    PancakeHouseMenu pancakeHouseMenu;
    DineMenu dineMenu;

    // 初始化兩個菜單
    public Waitress(PancakeHouseMenu pancakeHouseMenu, DineMenu dineMenu) {
        this.dineMenu = dineMenu;
        this.pancakeHouseMenu = pancakeHouseMenu;
    }

    public void printMenu() {
        // 為每一個菜單創建一個迭代器
        Iterator pancakeitIterator = pancakeHouseMenu.createIterator();
        Iterator dinerIterator = dineMenu.createIterator();
        System.out.println("Menu
=======
BreakFast");
        // 調用下面重載的方法
        printMenus(pancakeitIterator);
        System.out.println("
Lunch");
        // 調用下面重載的方法
        printMenus(dinerIterator);
    }

    // 重載一個printMenu()方法
    // 使用迭代器(一次循環即可)來遍歷菜單項并打印出來,只調用Iterator接口
    public void printMenus(Iterator iterator) {
        while (iterator.hasNext()) {
            // 取得下一項
            MenuItem menuItem = (MenuItem) iterator.next();
            System.out.print(menuItem.getName() + ", ");
            System.out.print(menuItem.getPrice() + ", ");
            System.out.println(menuItem.getDescription());
        }
    }
}

測試類

package TestMain;
import MenuItem.DineMenu;
import MenuItem.PancakeHouseMenu;
import MenuItem.Waitress;

public class MenuTestDrive {
    public static void main(String[] args) {
        PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();        
        DineMenu dineMenu = new DineMenu();
        /**
         *兩個菜單都實現一樣的方法,但是并沒有實現相同的接口,
         *女招待還是要依賴兩個具體實現的菜單類
         *后面就要修改這里
         *
         */
        Waitress waitress = new Waitress(pancakeHouseMenu, dineMenu);
        waitress.printMenu();
    }
}

效果圖如下

很巧妙的將兩者迭代取出來了。但兩者實現的接口卻完全一樣,這里其實還可以抽象出來成一個共同接口。

感謝你看到這里,迭代器模式上部分到這里就結束了,本人文筆隨便,若有不足或錯誤之處望給予指點,90度彎腰~~~很快我會補全這個內容,生命不息,編程不止!

參考書籍《Head First設計模式》

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67657.html

相關文章

  • php設計模式

    摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節我們介紹了...

    Dionysus_go 評論0 收藏0
  • php設計模式

    摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節我們介紹了...

    vspiders 評論0 收藏0
  • JAVA學習之路)集合

    摘要:集合中的集合是一種工具類,就像是容器,存儲任意數量的具有共同屬性的對象集合的作用在類的內部,對數據進行組織簡單而快速的搜索大量數目的條目有的集合接口,提供了一系列排列有序的元素,并且可以在序列中進行快速的插入和刪除有些集合接口,提供了映射關 集合 java中的集合: 是一種工具類,就像是容器,存儲任意數量的具有共同屬性的對象 集合的作用 1. 在類的內部,對數據進行組織 2. 簡單而快...

    sutaking 評論0 收藏0

發表評論

0條評論

Thanatos

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<