编程语言
首页 > 编程语言> > JAVA设计模式学习笔记-迭代器模式

JAVA设计模式学习笔记-迭代器模式

作者:互联网

两个菜馆合并后的菜单问题

蛋糕店与餐厅合并后,怎么统一管理菜单项目
问题:一个用ArrayList管理菜单,一个用数组管理

传统设计

菜单项

package com.java.jikexueyuan.iteratormode;

public class MenuItem {
    private String name,description;
    private boolean vegetable;
    private float price;
    public MenuItem(String name,String description,boolean vegetable,float price)
    {
        this.name=name;
        this.description=description;
        this.vegetable=vegetable;
        this.price=price;
        
    }
    public String getName()
    {
        return name;
    }
    public String getDescription()
    {
        return description;
    }
    public float getPrice()
    {
        return price;
    }
    public boolean  isVegetable()
    {
        return vegetable;
    }
}

蛋糕店菜单

package com.java.jikexueyuan.iteratormode;

import java.util.ArrayList;

public class CakeHouseMenu {
    private ArrayList<MenuItem> menuItems;

    public CakeHouseMenu() {
        menuItems = new ArrayList<MenuItem>();
        
        addItem("KFC Cake Breakfast","boiled eggs&toast&cabbage",true,3.99f);
        addItem("MDL Cake Breakfast","fried eggs&toast",false,3.59f);
        addItem("Stawberry Cake","fresh stawberry",true,3.29f);
        addItem("Regular Cake Breakfast","toast&sausage",true,2.59f);
    }

    private void addItem(String name, String description, boolean vegetable,
            float price) {
        MenuItem menuItem = new MenuItem(name, description, vegetable, price);
        menuItems.add(menuItem);
    }
    public ArrayList<MenuItem> getMenuItems() {
        return menuItems;
    }
    
    //其他功能代码
}

餐馆菜单

package com.java.jikexueyuan.iteratormode;

import java.util.ArrayList;

public class DinerMenu {
    private final static int Max_Items=5;
    public int numberOfItems=0;
    private MenuItem[] menuItems;
    
    public DinerMenu()
    {
        menuItems=new MenuItem[Max_Items] ;
        addItem("vegetable Blt","bacon&lettuce&tomato&cabbage",true,3.58f);
        addItem("Blt","bacon&lettuce&tomato",false,3.00f);
        addItem("bean soup","bean&potato salad",true,3.28f);
        addItem("hotdog","onions&cheese&bread",false,3.05f);
        
        
    }
    private void addItem(String name, String description, boolean vegetable,
            float price) {
        MenuItem menuItem = new MenuItem(name, description, vegetable, price);
        if(numberOfItems>=Max_Items)
        {
            System.err.println("sorry,menu is full!can not add another item");
        }else{
            menuItems[numberOfItems]=menuItem;
            numberOfItems++;
        }
        
    }
    
    public MenuItem[] getMenuItems() {
        return menuItems;
    }
}

女招待

package com.java.jikexueyuan.iteratormode;

import java.util.ArrayList;

public class Waitress {
    private CakeHouseMenu mCakeHouseMenu;
    private DinerMenu mDinerMenu;
    private ArrayList<MenuItem> cakeitems;
    private MenuItem[] dineritems;

    
    
    public Waitress() {
        mCakeHouseMenu = new CakeHouseMenu();
        cakeitems = mCakeHouseMenu.getMenuItems();

        mDinerMenu = new DinerMenu();
        dineritems = mDinerMenu.getMenuItems();
    }

    public void printMenu() {
        MenuItem menuItem;
        for (int i = 0, len = cakeitems.size(); i < len; i++) {
            menuItem = cakeitems.get(i);
            System.out.println(menuItem.getName() + "***"
                    +menuItem.getPrice()+"***"+ menuItem.getDescription());

        }
        for (int i = 0, len = mDinerMenu.numberOfItems; i < len; i++) {
            menuItem = dineritems[i];
            System.out.println(menuItem.getName() + "***"
                    +menuItem.getPrice()+"***"+ menuItem.getDescription());

        }

    }

    public void printBreakfastMenu() {

    }

    public void printLunchMenu() {

    }

    public void printVegetableMenu() {

    }
}

迭代器模式

封装遍历,迭代器接口
用迭代器接口改造菜单
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个对象

迭代器接口

package com.java.jikexueyuan.iteratormode.iterator;

public interface Iterator {
    
    public boolean hasNext();
    public Object next();

}

实现迭代器接口

package com.java.jikexueyuan.iteratormode.iterator;

import java.util.ArrayList;

import com.java.jikexueyuan.iteratormode.MenuItem;

public class DinerMenu {
    private final static int Max_Items = 5;
    private int numberOfItems = 0;
    private MenuItem[] menuItems;

    public DinerMenu() {
        menuItems = new MenuItem[Max_Items];
        addItem("vegetable Blt", "bacon&lettuce&tomato&cabbage", true, 3.58f);
        addItem("Blt", "bacon&lettuce&tomato", false, 3.00f);
        addItem("bean soup", "bean&potato salad", true, 3.28f);
        addItem("hotdog", "onions&cheese&bread", false, 3.05f);

    }

    private void addItem(String name, String description, boolean vegetable,
            float price) {
        MenuItem menuItem = new MenuItem(name, description, vegetable, price);
        if (numberOfItems >= Max_Items) {
            System.err.println("sorry,menu is full!can not add another item");
        } else {
            menuItems[numberOfItems] = menuItem;
            numberOfItems++;
        }

    }

    public Iterator getIterator() {
        return new DinerIterator();
    }

    class DinerIterator implements Iterator {
        private int position;

        public DinerIterator() {
            position = 0;
        }

        @Override
        public boolean hasNext() {
            // TODO Auto-generated method stub
            if (position < numberOfItems) {
                return true;
            }
            
            return false;
        }

        @Override
        public Object next() {
            // TODO Auto-generated method stub
            MenuItem menuItem = menuItems[position];
            position++;
            return menuItem;
        }
    };
}
package com.java.jikexueyuan.iteratormode.iterator;

import java.util.ArrayList;

import com.java.jikexueyuan.iteratormode.MenuItem;

public class CakeHouseMenu {
    private ArrayList<MenuItem> menuItems;
    
    
    public CakeHouseMenu() {
        menuItems = new ArrayList<MenuItem>();
        
        addItem("KFC Cake Breakfast","boiled eggs&toast&cabbage",true,3.99f);
        addItem("MDL Cake Breakfast","fried eggs&toast",false,3.59f);
        addItem("Stawberry Cake","fresh stawberry",true,3.29f);
        addItem("Regular Cake Breakfast","toast&sausage",true,2.59f);
    }

    private void addItem(String name, String description, boolean vegetable,
            float price) {
        MenuItem menuItem = new MenuItem(name, description, vegetable, price);
        menuItems.add(menuItem);
    }
    

    
    public Iterator getIterator()
    {
        return new CakeHouseIterator() ;
    }
    
    class CakeHouseIterator implements  Iterator
     {      
        private int position=0;
        public CakeHouseIterator()
        {
              position=0;
        }
        
            @Override
            public boolean hasNext() {
            // TODO Auto-generated method stub
            if(position<menuItems.size())
            {
                return true;
            }
            
            return false;
        }

        @Override
        public Object next() {
            // TODO Auto-generated method stub
            MenuItem menuItem =menuItems.get(position);
            position++;
            return menuItem;
        }};
    //其他功能代码
    
}

新的女招待

package com.java.jikexueyuan.iteratormode.iterator;

import java.util.ArrayList;

import com.java.jikexueyuan.iteratormode.MenuItem;

public class Waitress {
    private ArrayList<Iterator> iterators=new ArrayList<Iterator>();


    public Waitress() {
        
    }
    public void addIterator(Iterator iterator)
    {
        iterators.add(iterator);
        
    }
    public void printMenu() {
        Iterator iterator;
        MenuItem menuItem;
        for (int i = 0, len = iterators.size(); i < len; i++) {
            iterator = iterators.get(i);
            
            while(iterator.hasNext())
            {
                menuItem=(MenuItem) iterator.next();
                System.out.println(menuItem.getName() + "***"
                        +menuItem.getPrice()+"***"+ menuItem.getDescription());

            }
            
            
        }
        
        

    }

    public void printBreakfastMenu() {

    }

    public void printLunchMenu() {

    }

    public void printVegetableMenu() {

    }
}

测试类

package com.java.jikexueyuan.iteratormode.iterator;


public class MainTest {
    public static void main(String[] args) {
        Waitress mWaitress=new Waitress();
        CakeHouseMenu mCakeHouseMenu = new CakeHouseMenu();
        DinerMenu   mDinerMenu = new DinerMenu();
        
        mWaitress.addIterator(mCakeHouseMenu.getIterator());
        mWaitress.addIterator(mDinerMenu.getIterator());
        mWaitress.printMenu();
    }
}

标签:JAVA,迭代,addItem,private,MenuItem,menuItem,java,设计模式,public
来源: https://www.cnblogs.com/kristse/p/Iterator.html