Iterator 迭代器模式.ppt_第1页
Iterator 迭代器模式.ppt_第2页
Iterator 迭代器模式.ppt_第3页
Iterator 迭代器模式.ppt_第4页
Iterator 迭代器模式.ppt_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

iterator 迭代器,特大喜讯,pancake house(薄烤饼屋)早餐店和diner(用餐者)午餐店合并了,您现在可以在一个地方享受到美味的早餐和午餐。,哥们!我想用arraylist列我的pancake house为早餐菜单, diner为你的午餐菜单,如何?,靠!我不干,我喜欢用array,两份菜列表,实现很简单三个类搞定,menuitem类 public calss menuitem string name; string description; boolean vegetarian;/是否素食的 double price; public menuitem(string name,string description,boolean vegetarian,double price) /所有属性有get方法 ,pancakehouse的菜单 public class pancakehousemenu arraylist menuitems = new arraylist(); public pancakehouse() additem(“k ,增加菜单项,菜单项增加到列表中,返回菜单列表,dinermenu菜单 public class dinermenu( static final int max_items=6; int numberofitems = 0; menuitem menuitems = new menuitemmax_items; public dinermenu() additem(“vegetarian blt”,”bacon with lettuce ,如果你是服务员,你是如何展现这两份不同的菜单?并且还能说明菜单项是否是蔬食类。 产生一个服务员类,其方法如下: printmenu():打印菜单上的每一列 printbreakfastmenu():打印早餐列 printlunchmenu():打印午餐列 printvegetarianmenu():打印所有蔬食类列 isitemvegetarian(name):根据名字得到其是否是蔬食类的列,可以列出菜单了 一、 pancakehousemenu pancake=new pancakehousemenu(); arraylist breakfastitems=pancake.getmenuitems(); dinermenu dine = new dineermenu(); menuitem lunchitems=dinermenu.getmenuitems(); 注意:它返回的类型不同,二、 for(int i=0; ibreakfastitems.size(); i+) menuitem menuitem=(menuitem)breakfastitems.get(i); system.out.print(menuitem.getname() + “ ” + menuitem.getprice() + “ ” +menuitem.getdescription(); for(int i=0; ilunchitems.size(); i+) menuitem menuitem=lunchitemsi; system.out.print(menuitem.getname() + “ ” + menuitem.getprice() + “ ” +menuitem.getdescription(); 现在我们不得不执行两次不同的循坏,如果我们创建一个对象,把每一列数据存 入这个对象中,然后通过循环这个对取得 每一个列,是不是可以呢? 用早餐菜单做个列子,如下: iterator iterator = breakfastmenu.createiterator(); while(iterator.hasnext() menuitem menuitem = (menuitem)iterator.next(); ,形成一个接口: iterator 有两个方法如下: hasnext():判断集合是否有下一个元素 next():返回集合里的下一个对象 一但有了此接口,我们就能执行各种容器 对象:arrays,lists,hashtable. 爽,类关系图,具体执行循环的类,初始化数据等功能,dinermenuiterator类 public class dinermenuiterator implments iterator menuitem items; int position =0; public dinermenuiterator(menuitem items) this.items = items; public object next() menuitem menuitem = itemsposition; position = position + 1; return menuitem; public boolean hasnext() if(position = items.length | itemsposition = null) return false; else return true; ,dinemenu类 public class dinemenu static final int max_items = 6; int numberofitems = 0 ; menuitem menuitems; 。 public menuitem getmenuitems() return menuitems; public iterator createiterator() return new dinemenuiterator(menuitems); ,删除不用了,返回iterator接口,客户端不需要知道dinermenuiterator是如何执行的,waitress类 public class waitress pancakehousemenu pancakehousemenu; dinermenu dinermenu; public waitress(pancakehousemenu; pancakehousemenu,dinermenu dinermenu) this. pancakehousemenu = pancakehousemenu; this.dinermenu = dinermenu; public void printmenu() iterator pancakeiterator = pancakehousemenu.createiterator(); iterator dinermenuiterator = dinermenu.createiterator(); system.out.println(“menun-nbreakfast”); printmenu(pancakeiterator); system.out.println(“lunch”); printmenu(dinermenu); ,private void printmenu(iterator iterator) while(iterator.hasnext() menuitem menuitem = (menuitem)iterator.next(); system.out.println(menuitem.getname(); 如何使用?如下图,什么是迭代模式: 迭代模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。,看看上面的类图,是否有可改之处? 如果增加一个晚餐(supper),就需要重改waitress的构造函数,是不是我们可以重构此构造函数?,有相的方法 可以提出一个接口,如果客人在午餐后需要小甜点,这时我们的菜单该是什么样子的?,composite pattern(复合模式) allows you to compose object into tree structures to represent part-whole hierarchies. composite lets clients treat individual object and compositions of objects uniformly. 允许你组合对象到树形结构中,可以用整体或部分层次表现。组合物让客户交涉单独的对象和对象的成份,复合类图如下,client使用component接口去操作复合对象,component在所有对象(复合和叶子结点)中定义,叶子定义的复合元素行为,它通过执行operator方法达到复合的支持,复合的角色是定义具有孩子和存贮孩子结点的行为,采用复合模式构思我们的采单,menucomponent类 public abstract class menucomponent public void add(menucomponent menucomponent) throw new unsupporteoperationexcetion(); public void remove(menucomponent menucomponent) throw new unsupporteoperationexcetion(); public menucomponent getchild(int i) throw new unsupporteoperationexcetion(); public string getname() throw new unsupporteoperationexcetion(); public double getprice() throw new unsupporteoperationexcetion(); public boolean isvegetarian() throw new unsupporteoperationexcetion(); public void print() throw new unsupporteoperationexcetion();,operation方法,menuitem public class menuitem extends menucomponent string name; string description; boolean vegetarian; double price; public menuitem(string name,string description,boolean vegetarian,double price) = name; this.description = description; this.price = price; public string getname()return name; public string getdescription()return description; public double getprice()return price; public boolean isvegtarian()return vegetarian;,public void print() system.out.print(“ ” + getname(); if(isvegetarian() system.out.print(“ (v)”); system.out.print(“ ” + getprice(); system.out.print(“ - ” + getdescription(); ,menu类 public class meun extends menucomponent() arraylist menucomponents = new arraylist(); string name; string description; public menu(string name,string descrption) =name; this.description = description; public void add(menucomponent menucomponent) menucomponents .add(menucomponent); public void remove(menucomponent menucomponent) menucomponents.remove(menucomponent); public menucomponent getchild(int i) return (menucomponents) menucomponents.get(i); publ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论