`
bluethink
  • 浏览: 97084 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式学习之 迭代模式

    博客分类:
  • JAVA
阅读更多
迭代模式在日常的应用中几乎是无处不在,但是因为Java内部已经实现对集合对象的迭代,所以好像这种模式不常用,其实是用到了,只是没觉察到,今天就在这里剖析其中的秘密。


先看看迭代模式的类图:



关于迭代模式:
迭代模式提供了一种不暴漏集合对象的内部结构,又可以迭代该集合的方法,
关于迭代模式分离的集合对象的遍历行为,抽象出一个迭代类负责遍历,这样就做到了
不暴漏集合对象的内部结构,可以让外部代码透明的访问集合对象内部。

结构:
一个抽象的迭代类,定义了抽象的迭代方法;
一个抽象迭代类的子类,覆盖了父类的所有抽象迭代方法
该子类依赖聚集类的子类

一个抽象的聚集类,定义了创建的迭代类的抽象方法
一个抽象聚集类的子类,覆盖了父类的所有的抽象方法
该子类关联迭代类的子类

根据上面的描述,接下来看代码:

抽象的迭代类:
//创建抽象的迭代类,定了的抽象的迭代方法
public abstract class Iterator {
	public abstract String First();
	public abstract String Next();
	public abstract boolean IsDone();
	public abstract String CurrentItem();	
}


抽象迭代类的子类
//创建具体的迭代类,需要关联具体的聚集类
public class ConcreteIterator extends Iterator {
	private ConcreteAggregate aggregate;
	private int index=0;
	
	//定义迭代器的构造方法,使用一个聚集类作为入口参数
	public ConcreteIterator(ConcreteAggregate aggregate){
		this.aggregate = aggregate;		
	}
	
	//覆盖了父类的所有的抽象方法
	@Override
	public String CurrentItem() {
		return aggregate.getItem(index);
	}

	@Override
	public String First() {
		return aggregate.getItem(0);
	}
	
	@Override
	public String Next() {
		String ret="";		
		if (!IsDone()){
			ret = aggregate.getItem(index);
index +=1 ;
		}
		return ret;
	}

	@Override
	public boolean IsDone() {
		boolean ret;
		if (index >= aggregate.getCount()){
			ret = true;
		}else{
			ret = false;
		}
		return ret;
	}
}


抽象聚集类
//创建抽象的聚集类
public abstract class Aggregate {
	public abstract Iterator CreateIterator();
}


抽象聚集类的子类
//创建具体的聚集类,该类依赖ConcreteAggregate
public class ConcreteAggregate extends Aggregate{
	private List<String> items = new ArrayList<String>();
	
	@Override
	public Iterator CreateIterator() {
		return new ConcreteIterator(this);
	}
	
	public int getCount(){
		return items.size();
	}
	
	public String getItem(int index){
		return items.get(index);
	}
	
	public void setItem(String msg){
		items.add(msg);
	}
}


客户端代码
public class Test {
	public static void main(String[] args) {
		//创建一个集合对象
		ConcreteAggregate aggregate = new ConcreteAggregate();
		aggregate.setItem("AAAA");
		aggregate.setItem("BBBB");
		aggregate.setItem("CCCC");
		aggregate.setItem("DDDD");
		
		//创建一个该集合的迭代器,把集合作为参数传入
		Iterator i = new ConcreteIterator(aggregate);
		String x;		
		while(!i.IsDone()){
			x = i.Next();
			putln(x);
		}
	}	
	public static void putln(Object o){
		System.out.println(o);
	}
}


运行结果:

AAAA
BBBB
CCCC
DDDD

在回到上面的图中,在这个类图中可以看出:
迭代器类继承了抽象的迭代器
聚集类继承了抽象的父类,
但是ConcreteIterator和ConcreteAggregate是关联关系,
而 ConcreteAggregate和ConcreteIterator是依赖关系。

一点题外话:
这里有必要说明一下关联和依赖的区别,这两个概念其实很容易混淆
依赖是一个弱得关联,如果一个类A依赖一个类B,那么在A中B有3中用法:
B是全局的
B被实例化
B被作为参数传递

关联代表一种结构化的关系,表现为一个对象能获得另一个对象的实例引用并且调用它的服务,
依赖则是调用了一个对象的服务

关联还有单双向之分,双向关联,AB两个类,如果双向关联,则互为对方的Attribue,单向关联就是一个是另一个的Attribute
依赖则只有单向的

在ConcreteIterator中存在
ConcreteAggregate aggregate;

因此ConcreteAggregate 是ConcreteIterator的属性,属于关联关系

在ConcreteAggregate中存在
new ConcreteIterator(this);

ConcreteIterator 被实例化了,因此ConcreteAggregate 依赖 ConcreteAggregate
  • 大小: 51.9 KB
分享到:
评论

相关推荐

    设计模式之迭代器模式

    设计模式之迭代器模式,简单直接粗暴,值得学习,好好收藏。

    设计模式之迭代器与组合模式

    这份文档以例子的形式讲诉了设计模式之迭代器与组合模式,希望可以帮助学习的人!

    设计模式C++学习之迭代器模式(Iterator)

    设计模式C++学习之迭代器模式(Iterator)

    深入浅出学习Java设计模式之迭代器模式

    深入浅出学习Java设计模式之迭代器模式

    深入浅出学习Java设计模式之迭代器模式[参考].pdf

    深入浅出学习Java设计模式之迭代器模式[参考].pdf

    设计模式迭代器模式PPT学习教案.pptx

    "设计模式迭代器模式PPT学习教案" 迭代器模式是对象行为型模式,提供一种方法顺序访问一个聚合对象中各个元素,且不用暴露该对象的内部表示。迭代器模式的主要优点是将遍历数据的行为从聚合对象中分离出来,封装在...

    java后端开发+java23种设计模式学习demo

    设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式...

    研磨设计模式(完整带书签).part2.pdf

    也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章...

    尚硅谷设计模式源码笔记课件.zip

    2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,...

    23种Python设计模式示例演示源码包.rar

    23种Python设计模式示例演示源码包,比如包括了工厂模式、Bridge桥接模式、Builder构建模式、Facade外观模式、Adapter适配器模式,Composite组合模式、Decorator装饰器模式,FactoryMethod工厂方法模式、Flyweight享...

    学习JavaScript设计模式之迭代器模式

    迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。 JavaScript中的Array.prototype.forEach 一、jQuery中的迭代器 $.each([1, 2, 3], function(i, n) { console....

    深入浅出java设计模式(高清中文PDF)

    文件类型为PDF文件,此文档对20多种java设计模式进行了详细讲解,在中文讲解的过程中还附有代码示例给学习者进行参考,使学习者通过实践更容易理解设计模式的原理。 本文档目录: 1.工厂模式 2.单例模式 3.建造...

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    设计模式:可复用面向对象软件的基础--详细书签版

     “[设计模式]在实用环境下特别有用,因为它分类描述了一组设计良好,表达清楚的面向对象软件设计模式。整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法...

    论设计模式的重要性-《重学设计模式》

    其实各设计模式之间都是有共通之处的(在java中是抽象、继承、多态、组合的综合运用),有些看起来十分类似但又能解决不同的问题,这些都是前人总结的经验,你也可以组合出更适用于你所编写的程序的一种模式。

    设计模式 GOF 23

    本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用...

    Android源码设计模式解析与实战

    本书专门介绍Android源代码的设计模式,共26章,主要讲解面向对象的六大原则、主流的设计模式以及MVC和MVP模式。主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、...

    设计模式--C++

    1.1 什么是设计模式 2 1.2 Smalltalk MVC 中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...

    《c#设计模式》电子书+随书源码

    本书是第一部关于C#和.NET设计模式的权威指导著作,为基于C#语言和Microsoft ® .NET框架的开发人员学习设计模式和应用设计模式提供了一个完整全面的理论框架和大量的详细应用实例。 本书内容覆盖了所有23个经典的...

Global site tag (gtag.js) - Google Analytics