Java设计模式之迭代器模式和组合模式
2015-10-03 11:39
513 查看
为什么把这两个模式放在一起呢?我们一开始在进行聚合和组合关系对比的时候,经常将他们呢的异同进行对比一样,因为我们的这两个模式都涉及到部分和整体的关系,所以我们将这两个模式放在一起。
那么我们先来看一下迭代器模式的定义是提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示,迭代器让我们能游走于聚合内的每一个元素,而又不暴露其内部表示,把游走的任务放在迭代器上,而不是聚合上,这样简化了聚合的接口和实现,也让责任各得其所,所以迭代器模式又叫游标模式。
![](https://img-blog.csdn.net/20151003104658330?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
从上面的类图中我们可以看出来迭代子模式涉及到以下几个角色:
抽象迭代子(Iterator)角色:此抽象角色定义出遍历元素所需的接口。
具体迭代子(ConcreteIterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置。
聚集(Aggregate)角色:此抽象角色给出创建迭代子(Iterator)对象的接口。
具体聚集(ConcreteAggregate)角色:实现了创建迭代子(Iterator)对象的接口,返回一个合适的具体迭代子实例。
客户端(Client)角色:持有对聚集及其迭代子对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除。
public abstract class Aggregate {
/**
* 工厂方法,创建相应迭代子对象的接口
*/
public abstract Iterator createIterator();
}
public class ConcreteAggregate extends Aggregate {
private Object[] objArray = null;
/**
* 构造方法,传入聚合对象的具体内容
*/
public ConcreteAggregate(Object[] objArray){
this.objArray = objArray;
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
/**
* 取值方法:向外界提供聚集元素
*/
public Object getElement(int index){
if(index < objArray.length){
return objArray[index];
}else{
return null;
}
}
/**
* 取值方法:向外界提供聚集的大小
*/
public int size(){
return objArray.length;
}
}
public interface Iterator {
/**
* 迭代方法:移动到第一个元素
*/
public void first();
/**
* 迭代方法:移动到下一个元素
*/
public void next();
/**
* 迭代方法:是否为最后一个元素
*/
public boolean isDone();
/**
* 迭代方法:返还当前元素
*/
public Object currentItem();
}
public class Client {
public void operation(){
Object[] objArray = {"One","Two","Three","Four","Five","Six"};
//创建聚合对象
Aggregate agg = new ConcreteAggregate(objArray);
//循环输出聚合对象中的值
Iterator it = agg.createIterator();
while(!it.isDone()){
System.out.println(it.currentItem());
it.next();
}
}
public static void main(String[] args) {
Client client = new Client();
client.operation();
}
}
而我们说的组合模式允许对象组合以树形形式体现整体部分关系,当一个状态改变时一群对象会被通知到!
类似于我们做过的机房收费系统了面的上下机。
那么我们先来看一下迭代器模式的定义是提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示,迭代器让我们能游走于聚合内的每一个元素,而又不暴露其内部表示,把游走的任务放在迭代器上,而不是聚合上,这样简化了聚合的接口和实现,也让责任各得其所,所以迭代器模式又叫游标模式。
从上面的类图中我们可以看出来迭代子模式涉及到以下几个角色:
抽象迭代子(Iterator)角色:此抽象角色定义出遍历元素所需的接口。
具体迭代子(ConcreteIterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置。
聚集(Aggregate)角色:此抽象角色给出创建迭代子(Iterator)对象的接口。
具体聚集(ConcreteAggregate)角色:实现了创建迭代子(Iterator)对象的接口,返回一个合适的具体迭代子实例。
客户端(Client)角色:持有对聚集及其迭代子对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除。
public abstract class Aggregate {
/**
* 工厂方法,创建相应迭代子对象的接口
*/
public abstract Iterator createIterator();
}
public class ConcreteAggregate extends Aggregate {
private Object[] objArray = null;
/**
* 构造方法,传入聚合对象的具体内容
*/
public ConcreteAggregate(Object[] objArray){
this.objArray = objArray;
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
/**
* 取值方法:向外界提供聚集元素
*/
public Object getElement(int index){
if(index < objArray.length){
return objArray[index];
}else{
return null;
}
}
/**
* 取值方法:向外界提供聚集的大小
*/
public int size(){
return objArray.length;
}
}
public interface Iterator {
/**
* 迭代方法:移动到第一个元素
*/
public void first();
/**
* 迭代方法:移动到下一个元素
*/
public void next();
/**
* 迭代方法:是否为最后一个元素
*/
public boolean isDone();
/**
* 迭代方法:返还当前元素
*/
public Object currentItem();
}
public class Client {
public void operation(){
Object[] objArray = {"One","Two","Three","Four","Five","Six"};
//创建聚合对象
Aggregate agg = new ConcreteAggregate(objArray);
//循环输出聚合对象中的值
Iterator it = agg.createIterator();
while(!it.isDone()){
System.out.println(it.currentItem());
it.next();
}
}
public static void main(String[] args) {
Client client = new Client();
client.operation();
}
}
而我们说的组合模式允许对象组合以树形形式体现整体部分关系,当一个状态改变时一群对象会被通知到!
类似于我们做过的机房收费系统了面的上下机。
相关文章推荐
- spring mvc - cxf webservice项目
- java收集资料
- 转载 - Struts2基于XML配置方式实现对action的所有方法进行输入校验
- java nio基本概念
- Spring零碎知识复习
- Java Web 中文乱码问题
- spring资料收集
- 深入分析Java ClassLoader原理
- java -jar xxx.jar命令执行jar包时出现Error: Invalid or corrupt jarfile xxx.jar解决方案
- java篇 【14】Java 继承
- 设置myeclipse默认编码为UTF-8
- JAVA环境变量配置
- Iterator和ListIterator的知识点
- [leetcode-287]Find the Duplicate Number(java)
- eclipse+Java2WSDL+WSDL2Java 2012-12-06 12:32:43| 分类: j2ee |报道|字体大小 认购 一、eclipse如何使用低axis生成wsdl 可以使用
- java篇 【13】java怎样去开发一个程序呢
- Java闭包简析
- Java常用的设计模式05:常用设计模式之原型模式(创建型模式)
- jsp 百度编辑器配置 整合springmvc注意细节
- java学习笔记之动态编译