设计模式系列:迭代器模式

概念

迭代器一般用于访问聚合对象内部元素。只暴露该暴露的,隐藏该隐藏的。比如隐藏掉容器内部的实现逻辑,只暴露
遍历的接口。

实现

类图

图片

代码

  • Iterator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.littlehui.design.iterator;

/**
* @Description TODO
* @ClassName Iterator
* @Author littlehui
* @Date 2019/10/12 14:56
* @Version 1.0
**/
public interface Iterator {

boolean hasNext();

Object next();

void remove();
}
  • IteratorCreator
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.littlehui.design.iterator;

/**
* @Description TODO
* @ClassName IteratorCreator
* @Author littlehui
* @Date 2019/10/12 14:57
* @Version 1.0
**/
public interface IteratorCreator {

public Iterator createIterator();
}
  • MenuItem
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

package com.littlehui.design.iterator;

/**
* @Description TODO
* @ClassName MenuItem
* @Author littlehui
* @Date 2019/10/12 14:57
* @Version 1.0
**/
public class MenuItem {

private String code;

private String menuName;

public MenuItem(String code, String menuName) {
this.code = code;
this.menuName = menuName;
}

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

public String getMenuName() {
return menuName;
}

public void setMenuName(String menuName) {
this.menuName = menuName;
}

public void printMenu() {
System.out.println("编码:" + code + "名称:" + menuName);
}
}
  • MenuContainer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.littlehui.design.iterator;


import java.util.ArrayList;
import java.util.List;

/**
* @Description TODO
* @ClassName MenuContainer
* @Author littlehui
* @Date 2019/10/12 14:57
* @Version 1.0
**/
public class MenuContainer implements IteratorCreator {

private List<MenuItem> menuItems;

public MenuContainer(List<MenuItem> menuItems) {
this.menuItems = menuItems;
}

public MenuContainer() {

}

public void addMenuItem(MenuItem menuItem) {
if (menuItems == null) {
menuItems = new ArrayList<MenuItem>();
}
menuItems.add(menuItem);
}

@Override
public Iterator createIterator() {
return new MenuContainerIterator(menuItems);
}

}
  • MenuContainerIterator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

package com.littlehui.design.iterator;

import java.util.ArrayList;
import java.util.List;

/**
* @Description TODO
* @ClassName MenuContainerIterator
* @Author littlehui
* @Date 2019/10/12 14:58
* @Version 1.0
**/
public class MenuContainerIterator implements Iterator {

private List<MenuItem> menuItemList = null;

private int currentIndex = -1;

private int lastIndex = 0;

public MenuContainerIterator(List<MenuItem> menuItemList) {
this.menuItemList = menuItemList;
lastIndex = menuItemList.size() - 1;
}

@Override
public boolean hasNext() {
if (currentIndex < lastIndex) {
return true;
} else {
return false;
}
}

@Override
public Object next() {
MenuItem currentItem = menuItemList.get(++currentIndex);
return currentItem;
}

@Override
public void remove() {
menuItemList.remove(currentIndex);
--currentIndex;
lastIndex = menuItemList.size() - 1;
}
}
  • Client
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.littlehui.design.iterator;

import java.util.ArrayList;
import java.util.List;

/**
* @Description TODO
* @ClassName Client
* @Author littlehui
* @Date 2019/10/12 15:16
* @Version 1.0
**/
public class Client {

public static void main(String[] args) {

List<MenuItem> menuItemList = new ArrayList();
menuItemList.add(new MenuItem("CODE_1", "第一个菜单"));
menuItemList.add(new MenuItem("CODE_2", "第二个菜单"));
menuItemList.add(new MenuItem("CODE_3", "第三个菜单"));

MenuContainer menuContainer = new MenuContainer(menuItemList);
Iterator iterator = menuContainer.createIterator();
while (iterator.hasNext()) {
MenuItem item = (MenuItem)iterator.next();
if ("CODE_2".equals(item.getCode())) {
iterator.remove();
} else {
item.printMenu();
}
}
}
}
  • 执行
1
2
3
4
5
6
Connected to the target VM, address: '127.0.0.1:51875', transport: 'socket'
编码:CODE_1名称:第一个菜单
编码:CODE_3名称:第三个菜单
Disconnected from the target VM, address: '127.0.0.1:51875', transport: 'socket'

Process finished with exit code 0

场景

如上简单描述了一个菜单面板利用迭代器模式的遍历过程。

总结