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

缓存(caching): 当组合结构很复杂,或者遍历的代价太高,那么实现组合节点的缓存就很有帮助。

(1) Java Collection Framework 指的是一群类的接口。 其中包括了 ArrayList, Vector , LinkedList , Stack ,和 PriorityQueue. 这些类都实现了java.util.Collection接口。

(2) Collection接口中的一些方法:

add()  , addAll()  , clear() , contains() , containsAll() , equals() , hashCode() , isEmpty() ,
iterator() , remove()  , removeAll() , retainAll()--交集  size()  , toArray()

(3)Java5 的迭代器和集合 。 新形式的for语句 , 称为for / in 这可以让你在一个集合或者一个数组中遍历,而且不需要显示创建迭代器。

(4)需要使用Java 5 的泛型(generic)特性来确保for / in 的类型安全。

组合模式 : 就是树形结构 有 子节点和叶节点 子节点下还可以有子节点和叶节点。 (一般使用递归遍历

如菜单中还可以有子菜单

组合模式: 允许你将对象组合成树形结构来表现“整体/部分” 层次结构 ,组合能让客户以一致的方式处理个别对象以及对象组合。

(1) 组合模式让我们能用树形方式创建对象的结构,树里面包含了组合以及个别的对象。

(2)使用组合结构,我们能把相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象的差别。

一个菜单中还有子菜单  子菜单是以组合的方式

例:

MenuComponent类是 抽象的 组件基类 (菜单项 或子菜单 )

public class Menu extends MenuComponent{

ArrayList menuComponents = new ArrayList();

String name;

String description;

//构造器

public void print(){

syso.name;

syso.description;

Iterator iterator = menuComponents.iterator();   //如果菜单中碰见子菜单。 

while(iterator.hasNext()){

MenuComponent menuComponent = (MenuComponent)iterator.next();

menuComponent.print();  
//递归

}

}

}

组件:分为组合(子菜单) 。叶节点(菜单项)。

如:一个菜单如下:

红烧排骨

黄焖鸡

龙虾

子菜单 。。。。

大龙虾

组合模式以单一责任设计原则换取透明性(transparency).什么是透明性?通过让组件的接口同时包含一些管理了节点和叶节点的操作,客户就可以将组合和叶节点一视同仁。

例2:

public class Menu extends MenuComponent{  //子菜单

public Iterator createIterator(){

return new CompositeIterator(menuComponents.iterator());   //子菜单的迭代器。

}

}

public class MenuItem extends MenuComponent{  //菜单项

public Iterator createIterator(){

return new NullIterator();  //空的迭代器。 因为菜单项不需要迭代

}

}

CompositeIterator 确保 所有的子菜单(。。子子菜单)迭代器 都被包括进来。

public class CompositeIterator implements Iterator{  //和所有迭代器一样实现Iterator接口。

Statck stack = new Stack();

public CompositeIterator(Iterator iterator){//把要遍历的顶层组合(子菜单)的迭代器传入,抛进一个堆栈数据结构中。

stack.push(iterator);

}

public Object next(){

if(hasNext){

Iterator iterator =(Iterator) stack.peek();  取回顶层数据。

MenuComponent component = (MenuComponent) iterator.next();

if(component instanceof Menu){

stack.push(component.createIterator()); //如果元素是子菜单,则把子菜单迭代器放入stack中。 等待遍历。

}

return component;  //不管是 菜单项 还是子菜单 都返回。 打印出来

}else{

return null;

}

}

public boolean hasNext(){

if(stack.empty()){

return false;

}else{

Iterator iterator = (Iterator) stack.peek();   //取出顶层迭代器。

if( ! iterator.hasNext()){   //查看它是否有下一个元素如果没有(则是NullIterator 也就是菜单项 )弹出值栈,并移除。

stack.pop(); //返回并从堆栈中移除

return hasNext();  //递归调用 hasNext();

}else{

return true;

}

}

}

public void remove(){

throw new UnsupportedOperationException();  //不支持删除。这里只有遍历。

}

}

在我们在例1中写 递当print()时。 我们利用一个迭代器来遍历组件内的每个项。如果遇到的是菜单,(而不是菜单项),我们就会递归地调用print()方法处理它。换句话说,

其是在“ 内部 ” 自行处理遍历。

但例2 则是“ 外部 “的迭代器。这个例子中,必须维护组合递归结构的位置,也就是为什么在组合层次结构中上上下下时,使用堆栈来维护我们的位置。

====  为了要保持透明性,组合内所有的对象必须实现相同的接口(如:子菜单和菜单项)

空迭代器

public class NullIterator implements Iterator{

public Object next(){

return null;

}

pubic boolean hasNext(){

return false;    //永远返回 false;

}

public void remove(){

throw new UnsupportedOperationException();

}

}

要点:

(1)迭代器允许访问聚合的元素,而不需要暴露它的内部结构

(2)迭代器将遍历聚合的工作封装进一个对象中

(3)当使用迭代器的时候,我们依赖聚合提供遍历

(4)迭代器提供了一个通用的接口,让我们遍历聚合的项,当我们编码使用聚合的项时,就可以使用多态机制。 (子菜单和菜单项 多态为菜单)

(5)我们应该努力让一个类只分配一个责任

(6)组合模式提供一个结构,可同时包容个别对象以及组合对象一视同仁 (子菜单 和菜单项)

(7)组合结构内的任意对象称为组件,组件可以是组合,也可以是叶节点。

(8)在实现组合模式时,有许多设计上的折衷。你要根据需要平衡透明性和安全性。

设计模式(9.1)--迭代器与组合模式,布布扣,bubuko.com

时间: 2024-10-22 18:52:54

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

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

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

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

(1)散列表(hashtable)         共迭代器获取 hashtable.values().iterator();  因为每一笔数据都是由键值对组成. (2)迭代器是用来遍历集合的. Java5后集合都出了自己的遍历方式 如增加for循环.           遍历 也称 游走... (3)数组:Array 长定固定   集合:ArrayList 可扩展,取数据不需要转型 (4)Java中有自己的迭代器接口.在java.util.Iterator  . (5)集合:collectio

.NET设计模式(11):组合模式(Composite Pattern)(转)

概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 意图 将对象组合成树形结构以表示“部分-整体”的层次结构.Composite模式使得用户对单个对象和组合对象的使用具有一致性.[GOF <设计模式>] 结构图 图1 Composite模式结构图 生活中的例子 组合模式将对象组合成树形结构以表示"部分-整体"的层次结构.让用户一致地使用单

设计模式总结篇系列:组合模式(Composite)

在探讨Java组合模式之前,先要明白几个概念的区别:继承.组合和聚合. 继承是is-a的关系.组合和聚合有点像,有些书上没有作区分,都称之为has-a,有些书上对其进行了较为严格区分,组合是contains-a关系,聚合是has-a关系. 组合方式中被组合的对象生命周期不能超过整体,一般写代码时是直接在整体类的构造方法中创建被组合类的对象.如人和手之间的关系,人都没了,还何来手? 聚合方式中对于对象的生命周期则没有此类限制,一般可以在聚合类的构造函数中通过外部传参以赋值给整体(或通过其他set等

设计模式之第22章-组合模式(Java实现)

设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎么什么都不说就直接上来了.”“本式行不更名坐不改姓,就是组合模式来着,此次受作者之邀来讲讲我的前世今生来着.”“哦,你就是组合模式啊,久仰久仰.”“失敬失敬.”恩,首先我先说下定义:Compose objects into tree structure to represent part-whole

迭代器与组合模式

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

Java 设计模式系列(九)组合模式

Java 设计模式系列(九)组合模式 将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象的使用具有一致性. 一.组合模式结构 Component: 抽象的组件对象,为组合中的对象声明接口,让客户端可以通过这个接口来访问和管理整个对象结构,可以在里面为定义的功能提供缺省的实现. Leaf: 叶子节点对象,定义和实现叶子对象的行为,不再包含其它的子节点对象. Composite: 组合对象,通常会存储子组件,定义包含子组件的那些组件的行为,并实现在组件接口中定义

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

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

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

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