美文网首页
迭代器模式

迭代器模式

作者: yangzai | 来源:发表于2018-01-17 00:04 被阅读6次
    • 定义:
      提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示
    • UML:


      image.png
      • Aggregate:抽象容器,提供一个iterator()方法
      • ConcreteAggregate:就是抽象容器的具体实现类,组合一个迭代器。
      • Iterator:抽象迭代器,定义遍历元素所需要的方法
      • ConcreteIterator:迭代器实现,实现迭代具体操作。
    • 模型:
      中餐厅与蛋糕店点餐:两者最大的不同之处是前者用数组管理菜单,后者用集合管理。用户在使用这两者菜单的时候由于存储结构不同,需要分类处理,使用起来非常不方便。而迭代器模式就是解决这类问题。
    //定义一个抽象迭代器
    public interface Iterator { 
        public boolean hasNext();
        public Object next();   
    }
    //中餐厅的实现
    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() {
                if (position < numberOfItems) {
                    return true;
                }
                return false;
            }
            @Override
            public Object next() {
                MenuItem menuItem = menuItems[position];
                position++;
                return 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() {
                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;
            }};
    }
    
    • 使用方式:
    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 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();
        }
    }
    

    通过迭代器方式,用户在访问一个聚合对象时,不用关心究竟是集合还是数组或者是链表。用户也不需要关心怎样去操作元素,因为这些细节只有对象内部最清楚。用户只需要关心迭代器的接口,非常方便。当再来一个西餐厅,也只需要提供一个西餐厅菜单的迭代器即可。

    相关文章

      网友评论

          本文标题:迭代器模式

          本文链接:https://www.haomeiwen.com/subject/jstyoxtx.html