分享程序网
首页
  • java
微服务
微前端
环境搭建
数据库
设计模式
算法
软件
解决问题
链接
首页
  • java
微服务
微前端
环境搭建
数据库
设计模式
算法
软件
解决问题
链接
  • 创建模式

    • 单例模式
    • 工厂方法模式
    • 抽象工厂模式
    • 原型模式
    • 建造者模式
  • 结构模式

    • 适配器模式
    • 桥接模式
    • 组合模式
    • 装饰器模式
    • 门面模式
    • 享元模式
    • 代理模式
  • 行为模式

    • 责任链模式
    • 命令模式
    • 迭代器模式
    • 策略模式
    • 模板方法模式

迭代器模式

迭代器模式(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();
	}
}

所以我们平时不会用到过多的这种模式。

Last Updated:
Contributors: clcheng
Prev
命令模式
Next
策略模式