• JAVA设计模式---迭代器模式


    1、定义: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

    2、实例:
    1)需求:
    菜单(煎饼屋菜单、餐厅菜单和咖啡菜单)采用不同的集合存取(ArrayList,String[],Hashtable),使用迭代器模式使服务员(waitress)能够不依赖于具体菜单而实现打印菜单操作。

    2)代码实现:

      a)菜单接口及实体类:

    public interface Menu {
        public Iterator createIterator();
    }
    
    public class MenuItem {
        private String name;
        private String desc;
        private boolean vegetarian;
        private double price;
    
        public MenuItem(String name, String desc, boolean vegetarian, double price) {
            this.name = name;
            this.desc = desc;
            this.vegetarian = vegetarian;
            this.price = price;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getDesc() {
            return desc;
        }
    
        public void setDesc(String desc) {
            this.desc = desc;
        }
    
        public boolean isVegetarian() {
            return vegetarian;
        }
    
        public void setVegetarian(boolean vegetarian) {
            this.vegetarian = vegetarian;
        }
    
        public double getPrice() {
            return price;
        }
    
        public void setPrice(double price) {
            this.price = price;
        }
    }
    

      b) 菜单具体实现

    public class PancakeHouseMenu implements Menu {
        ArrayList menuItems;
    
        public PancakeHouseMenu() {
            menuItems = new ArrayList();
            addItem("kobe's pancake breakfast","pancakes with eggs",false,2.99);
            addItem("lilei's pancake breakfast", "pancakes with toast", false, 3.59);
        }
    
        public void addItem(String s, String s1, boolean b, double v) {
            MenuItem menuItem = new MenuItem(s,s1,b,v);
            menuItems.add(menuItem);
        }
    
        public Iterator createIterator(){
            return menuItems.iterator();
        }
    }
    
    public class DinnerMenu implements Menu {
        private static final int MAX_SIZE = 6;
        int numOfItems = 0;
        MenuItem[] menuItems;
    
        public DinnerMenu() {
            menuItems = new MenuItem[MAX_SIZE];
            addItem("Vegetarian BLT","Bacon with tomato",true,2.99);
            addItem("Hot dog","With onions and cheese",false,3.05);
        }
    
        private void addItem(String s, String s1, boolean b, double v) {
            MenuItem menuItem = new MenuItem(s,s1,b,v);
            if(numOfItems >= MAX_SIZE){
                System.err.println("sorry,menu is full!");
            }else{
                menuItems[numOfItems]=menuItem;
                numOfItems = numOfItems + 1;
            }
        }
    
        @Override
        public Iterator createIterator() {
            return new DinerMenuIterator(menuItems);
        }
    }
    
    public class CoffeeMenu implements Menu {
        Hashtable menuItems = new Hashtable();
    
        public CoffeeMenu() {
            addItem("Mocha","Han Meimei order on couple of Mocha",false,3.01);
        }
    
        private void addItem(String s, String s1, boolean b, double v) {
            MenuItem menuItem = new MenuItem(s,s1,b,v);
            menuItems.put(menuItem.getName(),menuItem);
        }
    
        @Override
        public Iterator createIterator() {
            return menuItems.values().iterator();
        }
    }
    

      c) 数组没有.iterator()方法,需要具体实现

    public class DinerMenuIterator implements Iterator {
        MenuItem[] list;
        int position = 0;
    
        public DinerMenuIterator(MenuItem[] list) {
            this.list = list;
        }
    
        @Override
        public boolean hasNext() {
            if(position>=list.length || list[position] == null){
                return false;
            }else{
                return true;
            }
        }
    
        @Override
        public Object next() {
            MenuItem menuItem = list[position];
            position = position + 1;
            return menuItem;
        }
    
        @Override
        public void remove() {
            if(position <=0){
                throw new IllegalStateException("now  you can not remove an item");
            }
            if(list[position] != null){
                for(int i=position-1;i<(list.length-1);i++){
                    list[i] = list[i+1];
                }
                list[list.length-1]=null;
            }
        }
    }
    

      d) waitress实现

    public class Waitress {
        Menu pancakeHouseMenu;
        Menu dinnerMenu;
        Menu coffeeMenu;
    
        public Waitress(Menu pancakeHouseMenu, Menu dinnerMenu, Menu coffeeMenu) {
            this.pancakeHouseMenu = pancakeHouseMenu;
            this.dinnerMenu = dinnerMenu;
            this.coffeeMenu = coffeeMenu;
        }
    
        public void printMenu(){
            Iterator pancakeHouseIterator = pancakeHouseMenu.createIterator();
            Iterator dinnerIterator = dinnerMenu.createIterator();
            Iterator coffeeIterator = coffeeMenu.createIterator();
            System.out.println("Menu
    =====Breakfast==start======");
            printMenu(pancakeHouseIterator);
            System.out.println("Menu
    =====Breakfast===end=====");
            System.out.println("Menu
    =====Lunch==start======");
            printMenu(dinnerIterator);
            System.out.println("Menu
    =====Lunch===end=====");
            System.out.println("Menu
    =====Coffee==start======");
            printMenu(coffeeIterator);
            System.out.println("Menu
    =====Coffee===end=====");
        }
    
        private void printMenu(Iterator iterator){
            while (iterator.hasNext()){
                MenuItem menuItem = (MenuItem)iterator.next();
                System.out.println(menuItem.getName()+", ");
                System.out.println(menuItem.getPrice()+", ");
                System.out.println(menuItem.getDesc());
            }
        }
    }
    

      e) 测试类

    public class MenuTest {
        public static void main(String[] args) {
            PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
            DinnerMenu dinnerMenu = new DinnerMenu();
            CoffeeMenu coffeeMenu = new CoffeeMenu();
    
            Waitress waitress = new Waitress(pancakeHouseMenu,dinnerMenu,coffeeMenu);
            waitress.printMenu();
        }
    }
    

      测试结果:

    Menu
    =====Breakfast==start======
    kobe's pancake breakfast,
    2.99,
    pancakes with eggs
    lilei's pancake breakfast,
    3.59,
    pancakes with toast
    Menu
    =====Breakfast===end=====
    Menu
    =====Lunch==start======
    Vegetarian BLT,
    2.99,
    Bacon with tomato
    Hot dog,
    3.05,
    With onions and cheese
    Menu
    =====Lunch===end=====
    Menu
    =====Coffee==start======
    Mocha,
    3.01,
    Han Meimei order on couple of Mocha
    Menu
    =====Coffee===end=====

  • 相关阅读:
    PHP 内核:foreach 是如何工作的(一)
    PHP 消息队列 Kafka 使用
    PHP7 生产环境队列 Beanstalkd 正确使用姿势
    你知道Laravel ORM 中的骚操作吗
    PHP 的 interface 有什么用处
    PHP 框架 Hyperf 实现处理超时未支付订单和延时队列
    java 浅谈web系统当中的cookie和session会话机制
    如何用charles进行https抓包
    Java实现图片按修改时间排序
    java读取文本文件内容
  • 原文地址:https://www.cnblogs.com/hunterCecil/p/5698961.html
Copyright © 2020-2023  润新知