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

資訊專欄INFORMATION COLUMN

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

Thanatos / 1535人閱讀

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

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

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

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

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

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

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

package MenuItem;

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

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

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

package MenuItem;

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

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

    // 返回?cái)?shù)組下一項(xiàng),索引自+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("清蒸時(shí)蔬加糙米", "清蒸的蔬菜配糙米", false, 3.05);

    }

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

    // 返回下一個(gè)元素
    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("清蒸時(shí)蔬加糙米", "清蒸的蔬菜配糙米", false, 3.05);

    }

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

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

package MenuItem;

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

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

    // 返回?cái)?shù)組下一項(xiàng),索引自+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("清蒸時(shí)蔬加糙米", "清蒸的蔬菜配糙米", false, 3.05);

    }

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

同理煎餅屋的實(shí)現(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("藍(lán)莓薄煎餅", "新鮮藍(lán)莓和藍(lán)莓糖漿做成的薄煎餅", false, 3.49);
        addItem("松餅", "可以選擇藍(lán)莓或草莓", true, 3.59);        

    }

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

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

女招待的實(shí)現(xiàn)

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

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

    public void printMenu() {
        // 為每一個(gè)菜單創(chuàng)建一個(gè)迭代器
        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);
    }

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

效果圖如下

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

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

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

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

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

相關(guān)文章

  • php設(shè)計(jì)模式

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

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

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

    vspiders 評論0 收藏0
  • JAVA學(xué)習(xí)之路)集合

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

    sutaking 評論0 收藏0

發(fā)表評論

0條評論

Thanatos

|高級講師

TA的文章

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