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=====
JAVA设计模式---迭代器模式的更多相关文章
- java设计模式——迭代器模式
一. 定义与类型 定义:提供一种方法,顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示 类型:行为型. 二. 使用场景 (1) 访问一个集合对象的内容而无需暴露它的内部表示 (2) 为遍 ...
- JAVA 设计模式 迭代器模式
用途 迭代器模式 (Iterator) 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 迭代器模式是一种行为型模式. 结构
- Java设计模式の迭代器模式
迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需 ...
- java设计模式----迭代器模式和组合模式
迭代器模式: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 设计原则: 单一责任:一个类应该只有一个引起变化的原因 组合模式: 允许你将对象组合成树形结构来表现“整体/部分” ...
- 19. 星际争霸之php设计模式--迭代器模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- Java设计模式——组合模式
JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...
- java设计模式--单列模式
java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...
- 3.java设计模式-建造者模式
Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
随机推荐
- 树莓派搭建WEB服务器
树莓派搭建WEB的教程网上有许多,但感觉每一篇都有一些问题,这次我将网上的教程汇总,并亲身实践,将注意的问题都写进去,方便新手学习! 目录:1,安装nginx+sqlite+php5打造轻量级服务器, ...
- 教你如何解决Sublime Text 3使用中出现的中文乱码问题
Sublime Text 3 是一个非常不错的源代码及文本编辑器,但是不支持GB2312和GBK编码在很多情况下会非常麻烦. 不过Sublime Package Control所提供的插件可以让Sub ...
- Springboot-shiro-redis实现登录认证和权限管理
Springboot-shiro-redis实现登录认证和权限管理 在学习之前: 首先进行一下Apache Shiro和Shiro比较: Apache Shiro是一个功能强大.灵活的,开源的安全框架 ...
- sql server2008数据库复制实现数据同步常见问题
sql server2008数据库复制实现数据同步常见问题 在原作者基础上追加 sql server2008数据库复制实现数据同步常见问题 23.发布 'xx' 的并发快照不可用,因为该快照尚未完全生 ...
- 根据PV统计出前三的热门板块,并统计出热门板块下的用户数--方式一
根据PV统计出前三的热门板块,并统计出热门板块下的用户数--方式一 测试数据 java代码 package com.hzf.spark.study; import java.util.ArrayLis ...
- IDC服务器的六大基础知识
无论企业或个人来说,一个是否适合自己的IDC运营商对于业务发展是至关重要的.然而很多用户对IDC行业一知半解,不太了解服务器的种类,更不知道选择什么样的服务器更适合自己了.今天编辑汇总了一些IDC所需 ...
- SQL用了Union后的排序问题
最近使用SQL语句进行UNION查询,惊奇的发现:SQL没问题,UNION查询也没问题,都可以得到想要的结果,可是在对结果进行排序的时候,却出问题了. 1.UNION查询没问题 SELECT `id` ...
- DEDE在图集列表中调出图集的所有图片[首页也适用]
在include/common.func.php 中添加以下函数代码 代码如下: // 在图集列表中调出图集的所有图片 function Getimgs($aid, $imgwith = 220, ...
- 织梦在服务器上面安装的时候一直提示data文件没有权限,可我已经写了权限,还是提示
1.进入服务器,打开IIS,点击相应无权限的文件夹data,然后点击右上角的编辑权限. 2.勾选写入,然后确定即可. 3.织梦一直收到黑客的攻击,这里建议站长朋友设置下权限,来降低织梦系统的危险系数. ...
- HTML 5 标签
HTML 5 标签 标签定义文档中的节(section.区段).比如章节.页眉.页脚或文档中的其他部分. E 9+.Firefox.Opera.Chrome 和 Safari 标签. 注释:IE 8 ...