Gof23种设计模式(17)——迭代器模式(Iterator)

2020年8月14日10:22:22 评论 54

1 基础知识

1.1 标准定义

迭代器(Iterator)模式标准定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

1.2 分析和说明

迭代器(Iterator)模式,属于对象行为型模式。迭代器模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代器模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代器模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代器对象,每一个迭代器的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。

迭代器(Iterator)模式结构如图1所示,其角色包括抽象迭代器(Iterator)角色、具体迭代器(Concrete Iterator)角色、聚集(Aggregate)角色、具体聚集(Concrete Aggregate)角色和客户端(Client)角色。

Gof23种设计模式(17)——迭代器模式(Iterator)图1 迭代器模式结构

 抽象迭代器(Iterator)角色:此抽象角色定义出遍历元素所需的接口。

 具体迭代器(Concrete Iterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置。

 聚集(Aggregate)角色:此抽象角色给出创建迭代器(Iterator)对象的接口。

 具体聚集(Concrete Aggregate)角色:实现了创建迭代器(Iterator)对象的接口,返回一个合适的具体迭代器实例。

 客户端(Client)角色:持有对聚集及其迭代器对象的引用,调用迭代器对象的迭代接口,也有可能通过迭代器操作聚集元素的增加和删除。

2 应用场景举例

比如公司想统计一下所有员工中有硕士文凭的人数和他们的姓名。可以把所有员工都放到一个集合中,然后一个一个地询问是否是硕士,这样就可以获得有多少个硕士了。用例图见图2。

Gof23种设计模式(17)——迭代器模式(Iterator)图2 迭代器模式用例图

在这里可以把Iterator抽象类理解为抽象迭代器(Iterator)角色。ImplementIterator类是具体迭代器(Concrete Iterator)角色。EmployeeCollection类是具体聚集(Concrete Aggregate)角色。其实现类图如图3所示。ImplementIterator类实现Iterator接口并关联EmployeeCollection。Employee类聚合EmployeeCollection类,即EmployeeCollection包容多个Employee。

Gof23种设计模式(17)——迭代器模式(Iterator)

图3 迭代器模式结构类图

迭代器模式实现顺序图见图4,实现顺序描述:
①基于Employee类创建employee对象;
②基于EmployeeCollection类创建employeeCollection对象;
③把employee对象添加到employeeCollection对象;
④基于ImplementIterator类创建iterator对象;
⑤调用iterator对象的next方法,对employeeCollection对象进行循环访问。

Gof23种设计模式(17)——迭代器模式(Iterator)

图4 迭代器模式实现顺序图

3.Java的实现程序代码

Java程序实现主要包括Iterator抽象类文件,ImplementIterator类文件,EmployeeCollection类文件和Employee类文件等4个文件。其关系如图3所示。下面分别列出这4个文件的程序代码,最后列出测试代码并显示输出结果。

Iterator抽象类程序代码清单01所示。

程序代码清单01

public abstract class Iterator {

	public Employee next() {
		return null;
	};

	public Employee previous() {
		return null;
	};

	// public Employee first(){return null;};
	// public Employee end(){return null;};
}

ImplementIterator类继承Iterator抽象类,其程序代码清单02所示。

程序代码清单02

public class ImplementIterator extends Iterator {

	private EmployeeCollection employeeCollection;
	private int currentIndex;

	public ImplementIterator(EmployeeCollection collection) {
		initizeIterator(collection);
	}

	private void initizeIterator(EmployeeCollection collection) {
		employeeCollection = collection;
		currentIndex = collection.getEmployeeMax() - 1;
	}

	public Employee next() {
		if (currentIndex == -1) {
			return null;
		}
		return employeeCollection.getEmployee(currentIndex--);
	}
}

EmployeeCollection类程序代码清单03所示。

程序代码清单03

public class EmployeeCollection {

	List<Employee> employeeList = new ArrayList<Employee>();
	private int employeeMax = 0;

	public EmployeeCollection addEmployee(Employee employee) {
		employeeList.add(employee);
		employeeMax++;
		return this;
	}

	public Employee getEmployee(int i) {
		return ((Employee) employeeList.get(i));
	}

	public int getEmployeeMax() {
		return employeeMax;
	}

	public void setEmployeeMax(int employeeMax) {
		this.employeeMax = employeeMax;
	}
}

Employee类程序代码清单04所示。

程序代码清单04

public class Employee {

	private String employeeName;
	private String education;

	public Employee(String name, String ed) {
		this.employeeName = name;
		this.education = ed;
	}

	public String getEmployeeName() {
		return employeeName;
	}

	public void setEmployeeName(String employeeName) {
		this.employeeName = employeeName;
	}

	public String getEducation() {
		return education;
	}

	public void setEducation(String education) {
		this.education = education;
	}
}

迭代器模式测试程序的代码清单05如下:

程序代码清单05

public class Client {

	public static void main(String[] args) {

		Employee employee;
		Employee employee1 = new Employee("小王", "学士");
		Employee employee2 = new Employee("小张", "学士");
		Employee employee3 = new Employee("小刘", "硕士");
		Employee employee4 = new Employee("小李", "学士");
		Employee employee5 = new Employee("小马", "硕士");

		EmployeeCollection employeeCollection = new EmployeeCollection();
		employeeCollection.addEmployee(employee1).addEmployee(employee2);
		employeeCollection.addEmployee(employee3).addEmployee(employee4);
		employeeCollection.addEmployee(employee5);

		ImplementIterator iterator = new ImplementIterator(employeeCollection);
		do {
			employee = iterator.next();
			if (employee != null) {
				if (employee.getEducation().equals("硕士")) {
					System.out.print(employee.getEmployeeName() + ";");
				}
			}
		} while (employee != null);
	}
}

迭代器模式测试类输出结果如下所示:

小马;小刘;

4 扩展和说明

在JDK中,已经实现了lterator模式。在JDK中的java.util.Iterator就是针对jave.util.Collection的lterator模式实现。Collection接口下的子接口包括Set、Array、List等。上述的例子程序代码可以修改如下。

程序代码清单08

public class Client {

	public static void main(String[] args) {

		Collection<Employee> employeeCollection = new ArrayList<Employee>();

		Employee employee;
		Employee employee1 = new Employee("小王", "学士");
		Employee employee2 = new Employee("小张", "学士");
		Employee employee3 = new Employee("小刘", "硕士");
		Employee employee4 = new Employee("小李", "学士");
		Employee employee5 = new Employee("小马", "硕士");

		employeeCollection.add(employee1);
		employeeCollection.add(employee2);
		employeeCollection.add(employee3);
		employeeCollection.add(employee4);
		employeeCollection.add(employee5);

		Iterator<Employee> iterator = employeeCollection.iterator();
		while (iterator.hasNext()) {
			employee = (Employee) iterator.next();
			if (employee.getEducation().equals("硕士")) {
				System.out.print(employee.getEmployeeName() + ";");
			}
		}
	}
}

参考链接

11种行为型模式

Gof23种设计模式(13)——解释器模式(Interpreter)
Gof23种设计模式(14)——模板方法模式(Template Method)
Gof23种设计模式(15)——责任链模式(Chain of Responsibility)
Gof23种设计模式(16)——命令模式(Command)
Gof23种设计模式(17)——迭代器模式(Iterator)
Gof23种设计模式(18)——中介者模式(Mediator)
Gof23种设计模式(19)——备忘录模式(Memento)
Gof23种设计模式(20)——观察者模式(Observer)
Gof23种设计模式(21)——状态模式(State)
Gof23种设计模式(22)——策略模式(Strategy)
Gof23种设计模式(23)——访问者模式(Visitor)
Gof23种设计模式 —— 行为型模式总结和比较

回到总目录Gof23种设计模式(全解析)

(转载自微信公众号:架构设计模式)

素课网
  • 本文由 发表于 2020年8月14日10:22:22
  • 转载请注明:https://www.suketech.com/9281.html
设计模式:面向对象设计的六大原则 - 总结 设计模式

设计模式:面向对象设计的六大原则 – 总结

开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统。开闭原则可能是设计模式六项原则中定义最模糊的一个了,它只告诉我们对扩展开放,对修改关闭,可是到底如何才能做到对扩展开放,对修...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: