设计模式(9)--迭代器与组合模式

(1)散列表(hashtable)         共迭代器获取 hashtable.values().iterator();  因为每一笔数据都是由键值对组成。

(2)迭代器是用来遍历集合的。 Java5后集合都出了自己的遍历方式 如增加for循环。           遍历 也称 游走。。。

(3)数组:Array 长定固定   集合:ArrayList 可扩展,取数据不需要转型

(4)Java中有自己的迭代器接口。在java.util.Iterator  .

(5)集合:collection 也可称为聚合(aggregate)。其存储方式可以是各种各样的数据结构,例如:列表 ,数组,散列表,

(6)collection 中的  如 ArrayList.iterator() 方式即可实现迭代器   hashtable.value().iterator() 。

(7)但数组不能通过 .iterator 的方式实现迭代器。 所以可以自定义迭代器。

单一责任:  设计原则: 一个类应该只有一个引起变化的原因 。如果一个类管理某种聚合,又负责遍历,则就有两种责任了。

内聚(cohesion):它用来度量一个类或模块紧密地达到单一目的或责任。

(1) 当一个模块或个类被设计成只支持一组相关的功能时,我们说它具有高内聚,返之,当被设计成支持一组不相关的功能时,我们说它具有低内聚。

(2)内聚是一个比单一责任原则更普遍的概念。两者关系密切。遵守这个原则的类容易具有高内聚。容易维护。

迭代器模式(Iterator Pattern):

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

例:现在有两个菜单,一个是数组,一个是ArrayList  。它俩的遍历方式不一样。 所以现在可以通过迭代器 封装遍历。

(-- 创建迭代器接口--)

(--创建一个菜单迭代器--) 此迭代器需要一个菜单数组做为参数

(--菜单中有一个createIteraor方法 返回一个菜单迭代器--)菜单中有菜单数组做为参数 给菜单迭代器。 然后利用菜单迭代器遍历菜单即可。

(--因为菜单中菜单数组做为参数 所以 Object next() 方法返回的是菜单中的菜单项--)

//定义迭代器接口
public interface Iterator{
  boolean hasNext();
  Object next();
}
//实现一个具体的迭代器 (数组菜单的)
public class DinerMenuIterator implements Iterator{ //实现迭代器接口
    MenuItem[] items ;
    int position =0;  //当前数组遍历的位置
    public DinerMenuIterator(MenuItem[] items){
       this.items = items;   //传入一个菜单项的数组当做参数
    }

    public Object next(){
       MenuItem menuItem = items[position];
       position = position+1;
       return menuItem;  
    }
    public boolean hasNext(){
       if(position>=items.length || items[position]==null){
          return false;
       }else{
          return true;          //hasNext()方法会检查我们是否已经取得数组的所有的元素。如果还有元素待遍历。,则返回true.
       }
    }

}
<pre name="code" class="java">// 利用迭代器改写菜单
public class DinerMenu{
  static final int MAX_ITEMS = 6;  //菜单中有6个菜
  int numberOfItems = 0;
  MenuItem[] menuitems;           //菜单项 组成的数组
  //构造器
  //addItem()
  public Iterator createIterator(){
    reuturn new DinerMenuIterator(menuItems);   返回一个菜单迭代器
  //返回迭代器接口。客户不知道 菜单是如何维护菜单项的,也不需要知道迭代器是如何迭现的。只需要利用这个迭代器遍历菜单即可。
}
</pre><pre name="code" class="java">  //利用迭代器遍历菜单
  private void printMenu(Iterator iterator){     //菜单创建出来的菜单迭代器 <span style="color:#ff0000;">会引用菜单中的菜单数组作为参数</span>
    while(iterator.hasNext()){
   <span style="white-space:pre">	</span> MenuItem menuItem = (MenuItem)iterator.next();
    }
  }
//数组菜单 的createIterator()方法 返回一个自定义的 菜单迭代器
//<span style="color:#ff0000;">Arraylist 的菜单 createItertor()方法 可以直接 调用 .iterator()方法返回 一个菜单迭代器</span>。 

上面是自定义迭代器。 可以使用java中的迭代器 java.util.Iterator 接口。
interface Iterator{
 hasNext()
 next()
 remove()  //
}
如果不提供 remove() 功能 则可以抛出运行时异常 。java.lang.UnsupportedOperationException。

ArrayList 有一个返回代器的iterator()方法  。ArrayList 并不需要实现自忆的迭代器
</pre><pre name="code" class="java">问: 在多线程下,可能会有多个迭代器引用同一个对象聚合。 remove()会造成怎样的影响?
答: 后果并没有指明 。当多线程使用迭代器时,必须特别小心。

迭代器模式让我们能游走于聚合内的每一人元素,而又不暴露其内部的表示

把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所

Java中有一个Enumeration(枚举)接口,  java.util.Enumeration 是一个有序的迭代器实现。

它有两个方法: hasMoreElements() 和 nextElement()。

你应该比较想用迭代器,而不是枚举。因为大多数的java类支持迭代器。

如果想把两者互想转换。 可以用适配器。。。

设计模式(9)--迭代器与组合模式

时间: 2024-08-07 10:34:45

设计模式(9)--迭代器与组合模式的相关文章

设计模式 3 —— 迭代器和组合模式

设计模式目录: 设计模式 1 ——观察者模式 设计模式 2 —— 装饰者模式 设计模式 3 —— 迭代器和组合模式 概要 设计模式 3 -- 迭代器和组合模式

设计模式之迭代器与组合模式(四)

因为这系列篇幅较长,所以在这里也不进行任何铺垫,直奔主题去啦. 利用组合设计菜单 我们要如何在菜单上应用组合模式呢?一开始,我们需要创建一个组件接口来作为菜单和菜单项的共同接口,让我们能够用统一的做法来处理菜单和菜单项.换句话说,我们可以针对菜单或菜单项调用相同的方法. 让我们从头来看看如何让菜单能够符合组合模式的结构: 实现菜单组件 好了,我们开始编写菜单组件的抽象类:请记住,菜单组件的角色是为叶节点和组合节点提供一个共同的接口. public abstract class MenuCompo

设计模式(9.1)--迭代器与组合模式

缓存(caching): 当组合结构很复杂,或者遍历的代价太高,那么实现组合节点的缓存就很有帮助. (1) Java Collection Framework 指的是一群类的接口. 其中包括了 ArrayList, Vector , LinkedList , Stack ,和 PriorityQueue. 这些类都实现了java.util.Collection接口. (2) Collection接口中的一些方法: add()  , addAll()  , clear() , contains()

设计模式(七)组合模式Composite(结构型)

设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.我们可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象.客户端代码必须区别对象简单对象和容器对象,而实际上大多数情况下用户认为它们是一样的.对这些类区别使用,使得程序更加复杂.递归使用的时候跟麻烦,而我们如何

迭代器与组合模式

迭代模式与组合模式要点: 1.迭代器允许访问聚合的元素,而不需要暴露它的内部结构 2.迭代器将遍历聚合的工作封装进一个对象中 3.当使用迭代器的时候,我们一来聚合提供遍历 4.迭代器提供了一个通用的接口,让我们遍历聚合的项时,就可以使用多态机制 5.我们应该努力让一个类只分配一个责任 6.组合模式提供一个结构,可同时包容个别对象和组合对象 7.组合模式允许客户对个别对象以及组合对象一视同仁 8.组合结构内的任意对象称为组件,组件可以使组合,也可以是叶子节点 9.在实现组合模式时,有许多设计上的折

设计模式08: Composite 组合模式(结构型模式)

Composite 组合模式(结构型模式) 对象容器的问题在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即他们在充当对象的同时,又是其他对象的容器. public interface IBox { void Process(); } public class SingleBox:IBox { public void Process(){...} } public class ContainerBox:IBox { public void Process(){...} public

headFirst学习笔记之九:迭代器与组合模式(5.1)

1.任务: 大新闻!对象村餐厅和对象村煎饼屋合并了!可以在同一个地方吃早饭和午饭了hohoho(有什么好开森的对象村的小伙伴们好容易满足). 但是有一个问题出现了:煎饼屋的菜单menu是用ArrayList记录菜单项menuItem,但是餐厅的菜单menu使用数组Array记录menuItem.大家都不愿意修改自己的结构,那么java女招待的任务就很繁重了啊,因为取出菜单项的方法就要记住两种了:menuItems.get(i)和menuItems[i]. 1 public class MenuI

迭代器和组合模式

一.迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 类图关系:            二.组合模式:允许你将对象组合成树形结构来表现"整体/部分"层次结构,组合能让客户以一致处理的方式处理个别对象以及对象的组合. 组合模式让我们能用树形方式创建对象的结构,树里面包含了组合和个别对象,使用组合我们应用相同的操作在组合和个别对象身上.及大多数情况下,可忽略组合和个别对象的差距. 类图:             

设计模式学习笔记之组合模式

组合模式 允许你将对象组合成树形结构来表现“整体/部分”层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 使用组合结构,我们能把相同的操作应用在组合和个别对象上.换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别. 说明: 1.组合模式使添加或者删除子节点变得容易: 场景: 1.想要标识对象的部分-整体结构: 2.想要客户端忽略组合对象和个体对象的差异,客户端将统一使用组合结构中的所有对象: /** * 为组合中所有对象定义一个接口,不管是组合还是节点 * */ pu