head first------------迭代器设计模式
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而不是去暴露其内部的表示。
以下是两种实现迭代器模式的方式:第一种为自定义的迭代器,第二种是利用JDK自身提供的Iterator实现
//第一种方式:自定义实现迭代器
package com.clark.iteratorpattern;
/**
* Menu Item class
* @author Administrator
*
*/
public class MenuItem {
private String name;//菜单名称
private String description;//菜单描述
private boolean vegetarian;//是否为蔬菜
private double price;//菜单价格
public MenuItem(String name, String description, boolean vegetarian,
double price) {
this.name = name;
this.description = description;
this.vegetarian = vegetarian;
this.price = price;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public boolean isVegetarian() {
return vegetarian;
}
public double getPrice() {
return price;
}
}
/**
* Menu Item class
* @author Administrator
*
*/
public class MenuItem {
private String name;//菜单名称
private String description;//菜单描述
private boolean vegetarian;//是否为蔬菜
private double price;//菜单价格
public MenuItem(String name, String description, boolean vegetarian,
double price) {
this.name = name;
this.description = description;
this.vegetarian = vegetarian;
this.price = price;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public boolean isVegetarian() {
return vegetarian;
}
public double getPrice() {
return price;
}
}
package com.clark.iteratorpattern;
/**
* 迭代器,其用于迭代输出
* @author Administrator
*
*/
public interface Iterator{
public boolean hasNext();
public Object next();
}
/**
* 迭代器,其用于迭代输出
* @author Administrator
*
*/
public interface Iterator{
public boolean hasNext();
public Object next();
}
package com.clark.iteratorpattern;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
/**
* 餐厅订单
* @author Administrator
*
*/
public class DinerMenu {
public static final int MAX_ITEMS=6;//限制最大数量为6
public int numberOfItems=0;//initialization zero
MenuItem[] menuItems;//用数组存储
//initialization DinerMenu
public DinerMenu(){
menuItems=new MenuItem[MAX_ITEMS];
addItem("Vegetarian BLT", "Bacon with lettuce on whole wheat", true, 3);
addItem("Soup of the day", "Soup of the day,With a side of potato salad", false, 4);
addItem("qing jiao chao rou", "la jiao chao rou", false, 3.4);
}
//add Item
public void addItem(String name,String description,boolean vegetarian,double price){
MenuItem menuItem=new MenuItem(name, description, vegetarian, price);
if(numberOfItems>=MAX_ITEMS){
System.out.println("Sorry,Menu is full! can't add item to menu");
}else{
menuItems[numberOfItems]=menuItem;
numberOfItems++;
}
}
//迭代得到Iterator接口
public Iterator createIterator(){
return new DinerMenuIterator(menuItems);
}
}
import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
/**
* 餐厅订单
* @author Administrator
*
*/
public class DinerMenu {
public static final int MAX_ITEMS=6;//限制最大数量为6
public int numberOfItems=0;//initialization zero
MenuItem[] menuItems;//用数组存储
//initialization DinerMenu
public DinerMenu(){
menuItems=new MenuItem[MAX_ITEMS];
addItem("Vegetarian BLT", "Bacon with lettuce on whole wheat", true, 3);
addItem("Soup of the day", "Soup of the day,With a side of potato salad", false, 4);
addItem("qing jiao chao rou", "la jiao chao rou", false, 3.4);
}
//add Item
public void addItem(String name,String description,boolean vegetarian,double price){
MenuItem menuItem=new MenuItem(name, description, vegetarian, price);
if(numberOfItems>=MAX_ITEMS){
System.out.println("Sorry,Menu is full! can't add item to menu");
}else{
menuItems[numberOfItems]=menuItem;
numberOfItems++;
}
}
//迭代得到Iterator接口
public Iterator createIterator(){
return new DinerMenuIterator(menuItems);
}
}
package com.clark.iteratorpattern;
/**
*
* @author Administrator
* Diner 实现Iterator 用于迭代输出菜单项
*/
public class DinerMenuIterator implements Iterator {
MenuItem[] items;
int position=0;
public DinerMenuIterator(MenuItem[] items){
this.items=items;
}
public boolean hasNext() {
if(position>=items.length||items[position]==null){
return false;
}else{
return true;
}
}
public Object next() {
MenuItem menuItem=items[position];
position++;
return menuItem;
}
}
/**
*
* @author Administrator
* Diner 实现Iterator 用于迭代输出菜单项
*/
public class DinerMenuIterator implements Iterator {
MenuItem[] items;
int position=0;
public DinerMenuIterator(MenuItem[] items){
this.items=items;
}
public boolean hasNext() {
if(position>=items.length||items[position]==null){
return false;
}else{
return true;
}
}
public Object next() {
MenuItem menuItem=items[position];
position++;
return menuItem;
}
}
package com.clark.iteratorpattern;
import java.util.ArrayList;
/**
* 煎饼屋
* @author Administrator
*
*/
public class PancakeHouseMenu{
ArrayList menuItems;//用ArrayList存储
//initialization DinerMenu
public PancakeHouseMenu(){
menuItems=new ArrayList();
addItem("Dangao BLT", "DanGao with lettuce on whole wheat", true, 3);
addItem("shaobing", "breakfast is shaobing", false, 5);
addItem("doujiang", "yingyang", false, 53.4);
}
//add Item
public void addItem(String name,String description,boolean vegetarian,double price){
MenuItem menuItem=new MenuItem(name, description, vegetarian, price);
menuItems.add(menuItem);
}
//迭代得到Iterator接口
public Iterator createIterator(){
return new PancakeHouseMenuIterator(menuItems);
}
}
import java.util.ArrayList;
/**
* 煎饼屋
* @author Administrator
*
*/
public class PancakeHouseMenu{
ArrayList menuItems;//用ArrayList存储
//initialization DinerMenu
public PancakeHouseMenu(){
menuItems=new ArrayList();
addItem("Dangao BLT", "DanGao with lettuce on whole wheat", true, 3);
addItem("shaobing", "breakfast is shaobing", false, 5);
addItem("doujiang", "yingyang", false, 53.4);
}
//add Item
public void addItem(String name,String description,boolean vegetarian,double price){
MenuItem menuItem=new MenuItem(name, description, vegetarian, price);
menuItems.add(menuItem);
}
//迭代得到Iterator接口
public Iterator createIterator(){
return new PancakeHouseMenuIterator(menuItems);
}
}
package com.clark.iteratorpattern;
import java.util.ArrayList;
/**
*
* @author Administrator
* Diner 实现Iterator 用于迭代输出菜单项
*/
public class PancakeHouseMenuIterator implements Iterator {
ArrayList items;
MenuItem menuItem;
int number=0;
public PancakeHouseMenuIterator(ArrayList items){
this.items=items;
}
public boolean hasNext() {
if(number>=items.size()||items.get(number)==null){
return false;
}else{
number++;
return true;
}
}
public Object next() {
return items.get(number-1);
}
}
import java.util.ArrayList;
/**
*
* @author Administrator
* Diner 实现Iterator 用于迭代输出菜单项
*/
public class PancakeHouseMenuIterator implements Iterator {
ArrayList items;
MenuItem menuItem;
int number=0;
public PancakeHouseMenuIterator(ArrayList items){
this.items=items;
}
public boolean hasNext() {
if(number>=items.size()||items.get(number)==null){
return false;
}else{
number++;
return true;
}
}
public Object next() {
return items.get(number-1);
}
}
package com.clark.iteratorpattern;
/**
* 服务员类
* @author Administrator
*/
public class Waitress {
//女招待员招待的两个菜单
public PancakeHouseMenu pancakeHouseMenu;
public DinerMenu dinerMenu;
public Waitress(PancakeHouseMenu pancakeHouseMenu, DinerMenu dinerMenu) {
this.pancakeHouseMenu = pancakeHouseMenu;
this.dinerMenu = dinerMenu;
}
//print menu detail
public void printMenu(){
Iterator pancakeIterator=pancakeHouseMenu.createIterator();
Iterator dinerIterator=dinerMenu.createIterator();
System.out.println("Menu\n---------\nBreakFast");
printMenu(pancakeIterator);
System.out.println("\nLunch");
printMenu(dinerIterator);
}
//print iterator
private void printMenu(Iterator iterator){
while(iterator.hasNext()){
MenuItem menu=(MenuItem)iterator.next();
System.out.print(menu.getName()+", ");
System.out.print(menu.getDescription()+", ");
System.out.println(menu.getPrice());
}
}
}
/**
* 服务员类
* @author Administrator
*/
public class Waitress {
//女招待员招待的两个菜单
public PancakeHouseMenu pancakeHouseMenu;
public DinerMenu dinerMenu;
public Waitress(PancakeHouseMenu pancakeHouseMenu, DinerMenu dinerMenu) {
this.pancakeHouseMenu = pancakeHouseMenu;
this.dinerMenu = dinerMenu;
}
//print menu detail
public void printMenu(){
Iterator pancakeIterator=pancakeHouseMenu.createIterator();
Iterator dinerIterator=dinerMenu.createIterator();
System.out.println("Menu\n---------\nBreakFast");
printMenu(pancakeIterator);
System.out.println("\nLunch");
printMenu(dinerIterator);
}
//print iterator
private void printMenu(Iterator iterator){
while(iterator.hasNext()){
MenuItem menu=(MenuItem)iterator.next();
System.out.print(menu.getName()+", ");
System.out.print(menu.getDescription()+", ");
System.out.println(menu.getPrice());
}
}
}
package com.clark.iteratorpattern;
/**
* Test CLASS
* @author Administrator
*
*/
public class MenuTestDrive {
public static void main(String[] args) {
PancakeHouseMenu pancakeHouseMenu=new PancakeHouseMenu();
DinerMenu dinerMenu=new DinerMenu();
Waitress ws=new Waitress(pancakeHouseMenu, dinerMenu);
ws.printMenu();
}
}
/**
* Test CLASS
* @author Administrator
*
*/
public class MenuTestDrive {
public static void main(String[] args) {
PancakeHouseMenu pancakeHouseMenu=new PancakeHouseMenu();
DinerMenu dinerMenu=new DinerMenu();
Waitress ws=new Waitress(pancakeHouseMenu, dinerMenu);
ws.printMenu();
}
}
//==================第二种:使用jdk自身迭代器实现====================
package com.clark.iteratorpattern.jdkiterator;
import java.util.Iterator;
public interface Menu {
public Iterator createIterator();
}
import java.util.Iterator;
public interface Menu {
public Iterator createIterator();
}
package com.clark.iteratorpattern.jdkiterator;
/**
* Menu Item class
* @author Administrator
*
*/
public class MenuItem {
private String name;//菜单名称
private String description;//菜单描述
private boolean vegetarian;//是否为蔬菜
private double price;//菜单价格
public MenuItem(String name, String description, boolean vegetarian,
double price) {
this.name = name;
this.description = description;
this.vegetarian = vegetarian;
this.price = price;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public boolean isVegetarian() {
return vegetarian;
}
public double getPrice() {
return price;
}
}
/**
* Menu Item class
* @author Administrator
*
*/
public class MenuItem {
private String name;//菜单名称
private String description;//菜单描述
private boolean vegetarian;//是否为蔬菜
private double price;//菜单价格
public MenuItem(String name, String description, boolean vegetarian,
double price) {
this.name = name;
this.description = description;
this.vegetarian = vegetarian;
this.price = price;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public boolean isVegetarian() {
return vegetarian;
}
public double getPrice() {
return price;
}
}
package com.clark.iteratorpattern.jdkiterator;
import java.util.Iterator;
public class DinerMenu implements Menu {
public static final int MAX_ITEMS=6;//限制最大数量为6
public int numberOfItems=0;//initialization zero
MenuItem[] menuItems;//用数组存储
//initialization DinerMenu
public DinerMenu(){
menuItems=new MenuItem[MAX_ITEMS];
addItem("Vegetarian BLT", "Bacon with lettuce on whole wheat", true, 3);
addItem("Soup of the day", "Soup of the day,With a side of potato salad", false, 4);
addItem("qing jiao chao rou", "la jiao chao rou", false, 3.4);
}
//add Item
public void addItem(String name,String description,boolean vegetarian,double price){
MenuItem menuItem=new MenuItem(name, description, vegetarian, price);
if(numberOfItems>=MAX_ITEMS){
System.out.println("Sorry,Menu is full! can't add item to menu");
}else{
menuItems[numberOfItems]=menuItem;
numberOfItems++;
}
}
//迭代得到Iterator接口
public Iterator createIterator(){
return new DinerMenuIterator(menuItems);
}
public MenuItem[] getMenuItems(){
return menuItems;
}
}
import java.util.Iterator;
public class DinerMenu implements Menu {
public static final int MAX_ITEMS=6;//限制最大数量为6
public int numberOfItems=0;//initialization zero
MenuItem[] menuItems;//用数组存储
//initialization DinerMenu
public DinerMenu(){
menuItems=new MenuItem[MAX_ITEMS];
addItem("Vegetarian BLT", "Bacon with lettuce on whole wheat", true, 3);
addItem("Soup of the day", "Soup of the day,With a side of potato salad", false, 4);
addItem("qing jiao chao rou", "la jiao chao rou", false, 3.4);
}
//add Item
public void addItem(String name,String description,boolean vegetarian,double price){
MenuItem menuItem=new MenuItem(name, description, vegetarian, price);
if(numberOfItems>=MAX_ITEMS){
System.out.println("Sorry,Menu is full! can't add item to menu");
}else{
menuItems[numberOfItems]=menuItem;
numberOfItems++;
}
}
//迭代得到Iterator接口
public Iterator createIterator(){
return new DinerMenuIterator(menuItems);
}
public MenuItem[] getMenuItems(){
return menuItems;
}
}
package com.clark.iteratorpattern.jdkiterator;
import java.util.Iterator;
/**
* 餐厅订单
* @author Administrator
*
*/
public class DinerMenuIterator implements Iterator{
MenuItem[] list;
int position = 0;
public DinerMenuIterator(MenuItem[] list) {
this.list = list;
}
public Object next() {
MenuItem menuItem = list[position];
position = position + 1;
return menuItem;
}
public boolean hasNext() {
if (position >= list.length || list[position] == null) {
return false;
} else {
return true;
}
}
public void remove() {
if (position <= 0) {
throw new IllegalStateException
("You can't remove an item until you've done at least one next()");
}
if (list[position-1] != null) {
for (int i = position-1; i < (list.length-1); i++) {
list[i] = list[i+1];
}
list[list.length-1] = null;
}
}
}
import java.util.Iterator;
/**
* 餐厅订单
* @author Administrator
*
*/
public class DinerMenuIterator implements Iterator{
MenuItem[] list;
int position = 0;
public DinerMenuIterator(MenuItem[] list) {
this.list = list;
}
public Object next() {
MenuItem menuItem = list[position];
position = position + 1;
return menuItem;
}
public boolean hasNext() {
if (position >= list.length || list[position] == null) {
return false;
} else {
return true;
}
}
public void remove() {
if (position <= 0) {
throw new IllegalStateException
("You can't remove an item until you've done at least one next()");
}
if (list[position-1] != null) {
for (int i = position-1; i < (list.length-1); i++) {
list[i] = list[i+1];
}
list[list.length-1] = null;
}
}
}
package com.clark.iteratorpattern.jdkiterator;
import java.util.ArrayList;
/**
* 煎饼屋
* @author Administrator
*
*/
public class PancakeHouseMenu implements Menu{
ArrayList menuItems;//用ArrayList存储,其可以实现Iterator的迭代
//initialization DinerMenu
public PancakeHouseMenu(){
menuItems=new ArrayList();
addItem("Dangao BLT", "DanGao with lettuce on whole wheat", true, 3);
addItem("shaobing", "breakfast is shaobing", false, 5);
addItem("doujiang", "yingyang", false, 53.4);
}
//add Item
public void addItem(String name,String description,boolean vegetarian,double price){
MenuItem menuItem=new MenuItem(name, description, vegetarian, price);
menuItems.add(menuItem);
}
//迭代得到Iterator接口
@Override
public java.util.Iterator createIterator() {
return menuItems.iterator();
}
public ArrayList getMenuItems(){
return menuItems;
}
}
import java.util.ArrayList;
/**
* 煎饼屋
* @author Administrator
*
*/
public class PancakeHouseMenu implements Menu{
ArrayList menuItems;//用ArrayList存储,其可以实现Iterator的迭代
//initialization DinerMenu
public PancakeHouseMenu(){
menuItems=new ArrayList();
addItem("Dangao BLT", "DanGao with lettuce on whole wheat", true, 3);
addItem("shaobing", "breakfast is shaobing", false, 5);
addItem("doujiang", "yingyang", false, 53.4);
}
//add Item
public void addItem(String name,String description,boolean vegetarian,double price){
MenuItem menuItem=new MenuItem(name, description, vegetarian, price);
menuItems.add(menuItem);
}
//迭代得到Iterator接口
@Override
public java.util.Iterator createIterator() {
return menuItems.iterator();
}
public ArrayList getMenuItems(){
return menuItems;
}
}
package com.clark.iteratorpattern.jdkiterator;
import java.util.Iterator;
/**
* 服务员类
* @author Administrator
*/
public class Waitress {
//女招待员招待的两个菜单
public Menu pancakeHouseMenu;
public Menu dinerMenu;
public Waitress(Menu pancakeHouseMenu, Menu dinerMenu) {
this.pancakeHouseMenu = pancakeHouseMenu;
this.dinerMenu = dinerMenu;
}
//print menu detail
public void printMenu(){
Iterator pancakeIterator= pancakeHouseMenu.createIterator();
Iterator dinerIterator= dinerMenu.createIterator();
System.out.println("Menu\n---------\nBreakFast");
printMenu(pancakeIterator);
System.out.println("\nLunch");
printMenu(dinerIterator);
}
//print iterator
private void printMenu(Iterator iterator){
while(iterator.hasNext()){
MenuItem menu=(MenuItem)iterator.next();
System.out.print(menu.getName()+", ");
System.out.print(menu.getDescription()+", ");
System.out.println(menu.getPrice());
}
}
}
import java.util.Iterator;
/**
* 服务员类
* @author Administrator
*/
public class Waitress {
//女招待员招待的两个菜单
public Menu pancakeHouseMenu;
public Menu dinerMenu;
public Waitress(Menu pancakeHouseMenu, Menu dinerMenu) {
this.pancakeHouseMenu = pancakeHouseMenu;
this.dinerMenu = dinerMenu;
}
//print menu detail
public void printMenu(){
Iterator pancakeIterator= pancakeHouseMenu.createIterator();
Iterator dinerIterator= dinerMenu.createIterator();
System.out.println("Menu\n---------\nBreakFast");
printMenu(pancakeIterator);
System.out.println("\nLunch");
printMenu(dinerIterator);
}
//print iterator
private void printMenu(Iterator iterator){
while(iterator.hasNext()){
MenuItem menu=(MenuItem)iterator.next();
System.out.print(menu.getName()+", ");
System.out.print(menu.getDescription()+", ");
System.out.println(menu.getPrice());
}
}
}
package com.clark.iteratorpattern.jdkiterator;
/**
* Test CLASS
* @author Administrator
*
*/
public class MenuTestDrive {
public static void main(String[] args) {
Menu pancakeHouseMenu=new PancakeHouseMenu();
Menu dinerMenu=new DinerMenu();
Waitress ws=new Waitress(pancakeHouseMenu, dinerMenu);
ws.printMenu();
}
}
/**
* Test CLASS
* @author Administrator
*
*/
public class MenuTestDrive {
public static void main(String[] args) {
Menu pancakeHouseMenu=new PancakeHouseMenu();
Menu dinerMenu=new DinerMenu();
Waitress ws=new Waitress(pancakeHouseMenu, dinerMenu);
ws.printMenu();
}
}