对象型行为模式之迭代器模式 重要等级5难度等级2

迭代器模式是一种设计模式,用于访问聚合对象的内容而不暴露其内部表示。它提供了一种统一的接口遍历不同聚合结构,并允许在不了解内部结构的情况下进行遍历。这种模式在遥控器与电视等场景中有应用。
摘要由CSDN通过智能技术生成

适用:访问一个聚合对象得内容而无须暴露它得内部表示。将聚合对象的访问与内部数据的存储分离,使得访问聚合对象时无须了解其内部的实现细节。需要为聚合对象提供多种遍历方式。为遍历不同聚合结构提供统一的接口。如:遥控器和电视

    迭代器模式是一种使用频率非常高的设计模式,迭代器用于对一个聚合对象进行遍历。怎样遍历一个聚合对象,又不需要了解聚合对象的内部结构,海能提供不同的遍历方式,这就是迭代器模式所要解决的问题。

    定义:提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标。

模式结构图:


角色:

Iterator:抽象迭代器

ConcreteIterator:具体迭代器

Aggregate:抽象聚合类

ConcreteAggregate:具体聚合类

聚合是一个管理和组织数据对象的数据结构。这就表明聚合首先应具备一个基本功能,即存储数据,这其中包含存储数据的类型,存储空间的大小,存储空间的分配,以及存储的方式和顺序。如果不具备这些特点,则该对象就不能称为聚合对象。

因此,聚合对象主要有两个职责:一是存储内部数据;而是遍历内部数据。但是前者时聚合对象的基本功能,而后者是可以分离的。因此,我们将遍历聚合对象中的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据。

代码实现(外部类):

客户端:

聚合类接口:

package com.iterator.hing;

public interface Television {
	public TVController createIterator();
}

迭代器接口(抽象迭代器):

package com.iterator.hing;

public interface TVController {
	public void setChannel(int i);
	public Object currentChannel();
	public void next();
	public void previous();
	public boolean isLast();
	public boolean isFirst();
}

具体聚合类1:

package com.iterator.hing;

public class HaierTV implements Television {
	private Object[] obj = {"1.四川卫视","2.经济频道","3.浙江卫视","4.CCTV-6","5.峨嵋电影频道","6.湖南卫视"};

	public Object[] getObj() {
		return obj;
	}

	public void setObj(Object[] obj) {
		this.obj = obj;
	}

	@Override
	public TVController createIterator() {
		// TODO Auto-generated method stub
		return null;
	}
}

具体迭代器1:

package com.iterator.hing;

public class HaierController implements TVController {
	private Object[] obj;
	//注意,此处也可以直接是聚合的对象,这样更好的体现聚合性。
	public HaierController(HaierTV ht) {
		this.obj = ht.getObj() ;
	}
	public HaierController() {
		
	}
	private int currentIndex = 0;
	@Override
	public void setChannel(int i) {
		currentIndex = i;
	}

	@Override
	public Object currentChannel() {
		// TODO Auto-generated method stub
		if(obj.length - 1 >= currentIndex) {
			return obj[currentIndex];
		}
		return null;
	}

	@Override
	public void next() {
		if(currentIndex + 1 >= obj.length ) {
			currentIndex = 0;
		}else {
			currentIndex ++;
		}

	}

	@Override
	public void previous() {
		if(currentIndex - 1 >= 0 ) {
			currentIndex --;
		}else {
			currentIndex = obj.length - 1;
		}

	}

	@Override
	public boolean isLast() {
		if(currentIndex == obj.length - 1)
			return true;
		return false;
	}

	@Override
	public boolean isFirst() {
		if(currentIndex == 0)
			return true;
		return false;
	}

}

具体聚合类2:

//和具体聚合类1类似

具体迭代器2:

//和具体迭代器1类似


此处还可使用内部类的方式来实现,即将迭代器写入到具体聚合类中去,那样可以简化一部分代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值