您的位置:首页 > 其它

设计模式迭代器模式(IteratorPattern)

2018-01-03 15:48 543 查看
核心模块:迭代器角色(定义访问和遍历元素的接口),具体迭代器角色,容器角色,具体容器角色

所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git

使用场景:外部对象访问内部聚合对象;

优点:将存储数据和遍历数据分开,符合单一职责原则;
缺点:新聚合类,就要增加新的迭代器类;增加系统复杂性;

/**
* Created by tory on 2017/12/29.
* 迭代器模式
*/
public class IteratorPattern {
public static void main(String[] args) {
//客户端要柔和业务员A和B的代码,两个聚合类;
TVChannelMenu tvChannelMenu = new TVChannelMenu();
TVMovieMenu tvMovieMenu = new TVMovieMenu();
printMenu(tvChannelMenu.createIterator());
printMenu(tvMovieMenu.createIterator());
}

//如果不使用迭代器模式这里要写两个循环遍历
public static void printMenu(Iterator<DataItem> iterator) {
while (iterator.hasNext()) {
DataItem item = iterator.next();
System.out.println("-->" + item.id + " " + item.name + " " + item.des);
}
}
}

//数据结构
class DataItem {
int id;
String name;
String des;

public DataItem(int id, String name, String des) {
this.id = id;
this.name = name;
this.des = des;
}
}

//Iterator 迭代器角色
interface Iterator<T> {
boolean hasNext();

T next();
}

//Concrete Iterator 具体迭代器角色
class TvChannelIterator implements Iterator<DataItem> {
List<DataItem> list;
int position = 0;

public TvChannelIterator(List<DataItem> list) {
this.list = list;
}

@Override
public boolean hasNext() {
return (position < list.size() - 1);
}

@Override
public DataItem next() {
return list.get(position++);
}
}

//Container 容器角色
interface Container {
void add(DataItem item);

Iterator createIterator();
}

//ConcreteContainer具体容器角色
class TVChannelMenu implements Container {
//业务员A提供的数据代码
List<DataItem> tvchannels = new ArrayList<>();

public TVChannelMenu() {
tvchannels.add(new DataItem(0, "还珠格格", "琼瑶小说改变"));
tvchannels.add(new DataItem(1, "新三国", "媲美冰与火之歌的史诗电视剧"));
tvchannels.add(new DataItem(2, "抗日神剧", "呵呵"));
}

@Override
public void add(DataItem item) {
if (null == item) {
return;
}
tvchannels.add(item);
}
@Override
public Iterator createIterator() {
Iterator iterator = new TvChannelIterator(tvchannels);
return iterator;
}
}

//Concrete Iterator 具体迭代器角色
class TVMovieIterator implements Iterator<DataItem> {
DataItem[] datas;
int MAX_LEN = 5;
int position = 0;

public TVMovieIterator(DataItem[] datas) {
this.datas = datas;
}

@Override
public boolean hasNext() {
return position < MAX_LEN;
}

@Override
public DataItem next() {
return datas[position++];
}
}

//ConcreteContainer具体容器角色
class TVMovieMenu implements Container{
//业务员B提供的数据代码
DataItem[] movies = new DataItem[5];

public TVMovieMenu() {
movies[0] = new DataItem(1, "肖生克的救赎", "一部人性解救的电影");
movies[1] = new DataItem(2, "哈利波特1", "讲述了一个奇幻魔法世界");
movies[2] = new DataItem(3, "变形金刚", "人与外星机器人并肩战斗");
movies[3] = new DataItem(4, "哈利波特1", "讲述了一个奇幻魔法世界");
movies[4] = new DataItem(5, "变形金刚", "人与外星机器人并肩战斗");
}

@Override
public void add(DataItem item) {

}
@Override
public Iterator createIterator() {
TVMovieIterator iterator = new TVMovieIterator(movies);
return iterator;
}
}


内容打印
Hello World!
-->0 还珠格格 琼瑶小说改变
-->1 新三国 媲美冰与火之歌的史诗电视剧
-->1 肖生克的救赎 一部人性解救的电影
-->2 哈利波特1 讲述了一个奇幻魔法世界
-->3 变形金刚 人与外星机器人并肩战斗
-->4 哈利波特1 讲述了一个奇幻魔法世界
-->5 变形金刚 人与外星机器人并肩战斗
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息