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\n=====Breakfast==start======");
        printMenu(pancakeHouseIterator);
        System.out.println("Menu\n=====Breakfast===end=====");
        System.out.println("Menu\n=====Lunch==start======");
        printMenu(dinnerIterator);
        System.out.println("Menu\n=====Lunch===end=====");
        System.out.println("Menu\n=====Coffee==start======");
        printMenu(coffeeIterator);
        System.out.println("Menu\n=====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=====

时间: 2024-10-04 19:42:01

JAVA设计模式---迭代器模式的相关文章

Java设计模式——迭代器模式

概述 网上大部分人说迭代模式的时候,总是以某一种可遍历的对象为例进行介绍.这是可行的,这也是迭代模式的基本原型.当我看到<Head Frist设计模式>中迭代模式的时候,感觉要是能从另一个角度来说明,可能更能够体现迭代模式的威力所在. 本文介绍的这种迭代模式,倒是更像是适配器-迭代器模式.希望于你有益~ 版权说明 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Coding-Naga发表日期: 2016年3月4日链接:http://blog.csdn.net/lemo

Java设计模式の迭代器模式

迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么三个方法:取得下一个元素的方法next(),判断是否遍历结束的方法hasNext()),移出当前对象的方法remove(), (2)具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代. (3)容器角色(Aggregate): 

设计模式 - 迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解

迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包含迭代器接口(iterator interface), import java.util.Iterator; 继承(

设计模式 - 迭代器模式(iterator pattern) 详解

迭代器模式(iterator pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露其内部的表示; 建立迭代器接口(iterator interface), 包含hasNext()方法和next()方法; 不同聚合对象的具体的迭代器(concrete iterator), 继承(implements)迭代器接口(iterator in

设计模式 - 迭代器模式(iterator pattern) 扩展 详解

迭代器模式(iterator pattern) 扩展 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式-Java迭代器: http://blog.csdn.net/caroline_wendy/article/details/35268931 扩展迭代器模式, 添加一个Hashtable存储的类. 具体方法: 1. Hashtable的类, 包含创建value()的迭代器(iterator). /** * @time 2014年6月27日

Java 设计模式 -- 复合模式之二

接着上文的鸭鸣例子:Java 设计模式 -- 复合模式之一 上文中,我们的鸭鸣实现了 装饰者模式  适配器模式  工厂模式的结合 现在,又需要进行改动了,上文,是可以统计一群鸭子的叫声,现在需要能够观察个别鸭子的行为 引入观察者模式: 任何想被观察的Quackable都必须实现下面的接口 public interface QuackObservable { public void registerObserver(Observer observer); public void notifyobs

一起学java设计模式--代理模式(结构型模式)

代理模式 应用软件所提供的桌面快捷方式是快速启动应用程序的代理,桌面快捷方式一般使用一张小图片来表示(Picture),通过调用快捷方式的run()方法将调用应用软件(Application)的run()方法.使用代理模式模拟该过程,绘制类图并编程实现. package ProxyPattern; interface Software { void run(); } class Application implements Software { public void run() { Syste

Java设计模式-代理模式之动态代理(附源码分析)

Java设计模式-代理模式之动态代理(附源码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的区别就是:动态代理是在运行时刻动态的创建出代理类及其对象.上篇中的静态代理是在编译的时候就确定了代理类具体类型,如果有多个类需要代理,那么就得创建多个.还有一点,如果Subject中新增了一个方法,那么对应的实现接口的类中也要相应的实习该方法,不符合设计模式原则. 动态代理的做法:在运行时刻,可以动态创建出一个实现了多个接口的代理类.每个代理类的对象都会关联一个表示内部处理

Java设计模式-代理模式之动态代理(附源代码分析)

Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代理是在编译的时候就确定了代理类详细类型.假设有多个类须要代理.那么就得创建多个. 另一点,假设Subject中新增了一个方法,那么相应的实现接口的类中也要相应的实现这些方法. 动态代理的做法:在执行时刻.能够动态创建出一个实现了多个接口的代理类.每一个代理类的对象都会关联一个表示内部处理逻辑的Inv