迭代器模式
迭代器模式(Iterator Pattern)目前已经是一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发,其定义如下: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。)
我们可以看一下组合模式的示例:
@Data
public class MenuTreeVo {
/**
* 菜单id
*/
private Integer id;
/**
* 菜单名称
*/
private String name;
/**
* 菜单路由(路径)
*/
private String path;
/**
* 菜单图标
*/
private String icon;
/**
* 菜单父级id
*/
private Integer parentId;
/**
* 子菜单
*/
private List<MenuTreeVo> children = new ArrayList<>();
}
我们知道parentId指向的是父节点id,如果是有需求说需要知道该目录的下一个目录是什么,当然这个需求很傻缺,我们实现的时候就可以加一个参数。
public class MenuTreeVo {
/**
* 菜单id
*/
private Integer id;
/**
* 菜单名称
*/
private String name;
/**
* 菜单路由(路径)
*/
private String path;
/**
* 菜单图标
*/
private String icon;
/**
* 菜单父级id
*/
private Integer parentId;
/**
* 子菜单
*/
private List<MenuTreeVo> children = new ArrayList<>();
private MenuTreeVo next;
}
next就是我们的下一个节点。当然我们还可以加一个判定是否又下一个节点。
但是通常我们都不会自己写一个迭代器,一般java的API已经提供了。尤其是我们在对list进行删除的时候务必注意,例如删除所有顶级节点:
List<MenuTreeVo> list = new ArrayList<MenuTreeVo>();
Iterator<MenuTreeVo> iterator = list.iterator();
while (iterator.hasNext()) {
MenuTreeVo next = iterator.next();
if (next.getParenId() == 0 || next.getParenId() == null) {
iterator.remove();
}
}
所以我们平时不会用到过多的这种模式。