成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

Thanatos / 1543人閱讀

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

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

好消息,當?shù)氐牟蛷d和煎餅屋合并了,但是兩者實現(xiàn)的方式卻不同,這就造成了分歧。讓我們一起去看看把。

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

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

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

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

package MenuItem;

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

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

然后先用DinerMenuIterator類去實現(xiàn)接口

package MenuItem;

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

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

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

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

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

package MenuItem;

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

    // 初始化數(shù)組,添加菜單內(nèi)容
    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);

    }

    // 創(chuàng)建一個添加菜單方法
    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 {
            // 菜單還沒滿還可以繼續(xù)添加
            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 {
    // 菜單總數(shù)
    static final int MAX_ITEMS = 6;
    // 菜單量
    int numberOfItems = 0;
    MenuItem[] menuItems;

    // 初始化數(shù)組,添加菜單內(nèi)容
    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);

    }

    // 創(chuàng)建一個添加菜單方法
    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 {
            // 菜單還沒滿還可以繼續(xù)添加
            menuItems[numberOfItems] = menuItem;
            numberOfItems += 1;
        }
    }

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

餐廳的實現(xiàn)以及接口

package MenuItem;

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

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

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

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

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

    // 初始化數(shù)組,添加菜單內(nèi)容
    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);

    }

    // 創(chuàng)建一個添加菜單方法
    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 {
            // 菜單還沒滿還可以繼續(xù)添加
            menuItems[numberOfItems] = menuItem;
            numberOfItems += 1;
        }
    }

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

同理煎餅屋的實現(xiàn)和接口

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);        

    }

    // 創(chuàng)建一個添加菜單方法
    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);
    }
}

女招待的實現(xiàn)

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

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

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

    // 重載一個printMenu()方法
    // 使用迭代器(一次循環(huán)即可)來遍歷菜單項并打印出來,只調(diào)用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();
        /**
         *兩個菜單都實現(xiàn)一樣的方法,但是并沒有實現(xiàn)相同的接口,
         *女招待還是要依賴兩個具體實現(xiàn)的菜單類
         *后面就要修改這里
         *
         */
        Waitress waitress = new Waitress(pancakeHouseMenu, dineMenu);
        waitress.printMenu();
    }
}

效果圖如下

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

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

參考書籍《Head First設(shè)計模式》

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67657.html

相關(guān)文章

  • php設(shè)計模式

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

    Dionysus_go 評論0 收藏0
  • php設(shè)計模式

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

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

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

    sutaking 評論0 收藏0

發(fā)表評論

0條評論

Thanatos

|高級講師

TA的文章

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