`
bluethink
  • 浏览: 97900 次
  • 性别: 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
分享到:
评论

相关推荐

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

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

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...

    设计模式之迭代器模式(新)

    迭代器模式是软件设计模式中的一种行为模式,它允许我们顺序访问聚合对象的元素,而无需暴露其底层表示。...在“设计模式之迭代器模式(新)”的学习中,你将能够深入理解这一模式的精髓,并在实际项目中有效利用它。

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

    迭代器模式是软件设计模式中的行为模式之一,它在C++编程中有着广泛的应用。这个模式提供了一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。通过迭代器,用户可以遍历集合中的所有元素,而无需知道如何...

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

    迭代器模式是一种设计模式,它的主要目的是在不暴露容器内部结构的情况下,允许用户遍历容器中的元素。在Java中,这种模式被广泛应用于集合类,如List、Set和Map等,通过Iterator接口来实现对集合的遍历。 迭代器...

    IteratorPattern 迭代设计模式

    迭代器模式(IteratorPattern)是设计模式中的一种行为模式,它提供了一种顺序访问聚合对象元素的方法,同时又不暴露其底层表示。这种模式允许我们遍历集合对象的元素,而无需暴露其内部结构。在Java、C#等面向对象...

    Android设计模式之--迭代器模式

    迭代器模式是软件设计模式中的一种行为模式,它在Android开发中被广泛应用,尤其是在处理集合对象的遍历操作时。这种模式提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。在Java或Android编程中,...

    23个设计模式之一的迭代器模式-极客学院-java-课件代码,

    迭代器模式是软件设计模式中的行为模式之一,它提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。在Java编程语言中,迭代器模式的应用尤为广泛,尤其是在处理集合类如ArrayList、LinkedList等时。这...

    设计模式之美——教你写出高质量代码

    "设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...

    (行为型模式) Iterator 迭代器模式

    为了进一步深入学习迭代器模式和其他设计模式,以下是一些值得推荐的资源: - 《设计模式:可复用面向对象软件的基础》(GoF 四人组著) - 《面向对象分析与设计》(Grady Booch 著) - 《敏捷软件开发:原则、模式...

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

    迭代器模式是一种设计模式,它的主要目的是在不暴露容器对象的内部细节的前提下,提供一种方法来遍历容器中的元素。这种模式遵循了“单一职责原则”,使得容器专注于管理其内部元素,而遍历的责任则交给迭代器来处理...

    24种设计模式以及混合设计模式

    通过学习和应用这些设计模式,开发者不仅可以提高代码的可读性、可维护性和可扩展性,还能提升团队间的沟通效率,因为设计模式是软件工程中的通用语言。对于任何有志于提升软件开发水平的人来说,理解和掌握设计模式...

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

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

    C#设计模式迭代器示例

    迭代器模式是软件设计模式中的一种行为模式,它允许我们顺序访问聚合对象的元素,而无需暴露其底层表示。在C#中,迭代器模式的应用非常广泛,尤其是在处理集合类库时。本教程将深入讲解如何在C#中实现迭代器模式。 ...

    设计模式学习.zip

    本资源"设计模式学习.zip"聚焦于C++编程语言中的设计模式应用,是2017年的一次黑马程序员培训课程的配套代码,旨在帮助学习者通过实际的代码示例来理解和掌握设计模式。 在C++中,设计模式主要分为三大类:创建型...

    状态及模板和迭代等设计模式及实现

    在给定的标题“状态及模板和迭代等设计模式及实现”中,提到了三种经典的设计模式:状态模式、模板模式和迭代器模式。这些模式都是软件工程中常用的设计策略,旨在提高代码的可复用性、可读性和可维护性。 **状态...

    新版设计模式手册 - C#设计模式(第二版)

    总之,《新版设计模式手册 - C#设计模式(第二版)》是学习和掌握C#设计模式的宝贵资源,通过学习和实践书中的内容,开发者能够提升软件设计能力,编写出更优雅、可维护的代码。这本书将帮助你从一个代码实现者成长为...

    《Java设计模式》刘伟 课后习题及模拟试题答案.rar

    这本书的课后习题和模拟试题旨在帮助读者巩固学习内容,加深对设计模式的理解,提升实际编程能力。 课后习题参考答案部分涵盖了书中各个章节的关键知识点,包括创建型模式(如单例模式、工厂方法模式、抽象工厂模式...

    Head First 设计模式 (九) 迭代器与组合模式(Iterator & Composite pattern) C++实现

    迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)是设计模式中的两种重要结构型模式,它们在软件设计中...在《Head First 设计模式》中,作者通过直观易懂的方式讲解了这两种模式,值得深入学习和实践。

Global site tag (gtag.js) - Google Analytics