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=====

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

  1. java设计模式——迭代器模式

    一. 定义与类型 定义:提供一种方法,顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示 类型:行为型. 二. 使用场景 (1) 访问一个集合对象的内容而无需暴露它的内部表示 (2)  为遍 ...

  2. JAVA 设计模式 迭代器模式

    用途 迭代器模式 (Iterator) 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 迭代器模式是一种行为型模式. 结构

  3. Java设计模式の迭代器模式

    迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需 ...

  4. java设计模式----迭代器模式和组合模式

    迭代器模式: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 设计原则: 单一责任:一个类应该只有一个引起变化的原因 组合模式: 允许你将对象组合成树形结构来表现“整体/部分” ...

  5. 19. 星际争霸之php设计模式--迭代器模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  6. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  7. java设计模式--单列模式

    java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...

  8. 3.java设计模式-建造者模式

    Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...

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

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

随机推荐

  1. C#初学者们,请离代码生成器远点!!!

    在程序开发的世界里,各路前辈们为了提高所谓的编码速度,搞出了各式各样的代码生成器,来避免所谓的重复的人为机械地粘贴和复制代码,以此来提高生产力. 早几年前,我可能会认为这样的做法真得有用,特别是在编码 ...

  2. python写zip破解器

    浏览桌面依然平静,!!!!等等..怎么有个压缩包 打开一看!!!156.txt???waht the fuck? 卧槽还有密码!!!!!! 但是我不知道╮(╯▽╰)╭该怎么办呢! 很简单,python ...

  3. Codeforces 725B Food on the Plane

    B. Food on the Plane time limit per test:2 seconds memory limit per test:256 megabytes input:standar ...

  4. hdu_1026(最短路)

    题意:最快出去的路径 题解:一看就是一个很简单的最短路,用优先队列写个spfa就过了,但是没想到水了个(n*n)^2的算法也过了...愿意很简单,因为是个稀疏图 敲完以后一百度发现就是个简单的bfs+ ...

  5. 模板类-bitset

    stl提供了std::bitset模板类,定义:bitset <32> bitvec;尖括号中的为长度,这条语句把bitvec定义为含有32个的bitset对象.和容器一样,按位置来访问他 ...

  6. 二维数组模拟实现酒店管理系统-java

    业务分析 1.需要一个房间类,包含房间的属性,比如房间编号.房间类型.是否占用. 2.需要一个旅馆类,旅馆有房间,提供的方法需要有 预订房间.打印房间信息.初始化房间.退房. 3.测试类,测试预订房间 ...

  7. 用AngularJS实现对表格的增删改查(仅限前端)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. Flexbox学习总结

    flex语法 采用Flex布局的元素,称为Flex容器(flex container),简称"容器".它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称& ...

  9. Asp.net mvc 中Action 方法的执行(二)

    [toc] 前面介绍了 Action 执行过程中的几个基本的组件,这里介绍 Action 方法的参数绑定. 数据来源 为 Action 方法提供参数绑定的原始数据来源于当前的 Http 请求,可能包含 ...

  10. Mysql Order By 字符串排序,mysql 字符串order by

    Mysql Order By 字符串排序,mysql 字符串order by ============================== ©Copyright 蕃薯耀 2017年9月30日 http ...