设计模式的分类
我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:
- 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
- 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
- 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
设计模式系列文章传送门
什么是迭代器模式
迭代器模式是一种行为设计模式,它提供了统一方法来访问聚合对象(如数组、列表、树等复杂的数据结构)中的各个元素,而又不暴露该对象的内部表示,简单来说,就像是给数据结构配备了一个 “导游”,这个 “导游” 可以按照一定的规则(如顺序、逆序等)带领你访问数据结构中的每一个元素。
迭代器模式的组成
- 抽象迭代器:定义了访问和遍历元素的方法,包括 hasNext()方法(用于判断是否还有下一个元素)和 next()方法(用于获取下一个元素)。
- 具体迭代器:实现抽象迭代器接口,并重写其方法,完成具体的遍历逻辑,它要维护一个指向聚合对象当前元素的游标,并且根据迭代器接口定义的方法来实现元素的遍历。
- 抽象聚合器:一般是一个接口,定义了创建迭代器的方法
- 具体聚合器:实现抽象聚合器器接口,它包含了实际存储元素的数据结构,并且创建了具体的迭代器。
迭代器设计模式案例演示
我们以公司员工来做为演示场景,公司年会的时候需要当众表扬优秀员工,会在大屏幕上播放优秀员工信息,我们使用迭代器设计模式来实现,优秀员工名单就是一个集合,每个优秀员工就是集合中的元素。
Staff(员工类)
Staff 类定义了员工基本属性,代码如下:
public class Staff {
//姓名
private String name;
//工号
private String jobNumber;
public Staff(String name, String jobNumber) {
this.name = name;
this.jobNumber = jobNumber;
}
@Override
public String toString() {
return "Staff{" +
"name='" + name + '\'' +
", jobNumber='" + jobNumber + '\'' +
'}';
}
}
StaffIterator(抽象迭代器)
StaffIterator 继承了 Iterator 接口,Iterator 接口中提供了 hasNext()方法(用于判断是否还有下一个元素)和 next()方法(用于获取下一个元素)方法,代码如下:
public interface StaffIterator extends Iterator<Staff> {
}
StaffIteratorImpl(具体迭代器)
StaffIteratorImpl 持有一个用户集合,并重新了 hasNext()方法(用于判断是否还有下一个元素)和 next()方法,代码如下:
public class StaffAggregateImpl implements StaffAggregate {
private List<Staff> staffList = new ArrayList<>();
@Override
public StaffIterator createIterator() {
return new StaffIteratorImpl(staffList);
}
@Override
public void add(Staff staff) {
staffList.add(staff);
}
}
StaffAggregate(抽象聚合器)
StaffAggregate 接口定义了一个创建迭代器的方法,并提供了一个添加元素的方法,代码如下:
public interface StaffAggregate {
//创建迭代器
StaffIterator createIterator();
//添加员工
void add(Staff staff);
}
StaffAggregateImpl(具体聚合器)
StaffAggregateImpl 实现了抽象聚合器接口,并重写了方法,代码如下:
public class StaffAggregateImpl implements StaffAggregate {
private List<Staff> staffList = new ArrayList<>();
@Override
public StaffIterator createIterator() {
return new StaffIteratorImpl(staffList);
}
@Override
public void add(Staff staff) {
staffList.add(staff);
}
}
IteratorClient(客户端代码)
IteratorClient 客户端验证代码如下:
public class IteratorClient {
public static void main(String[] args) {
StaffAggregateImpl staffAggregate=new StaffAggregateImpl();
staffAggregate.add(new Staff("小明","001"));
staffAggregate.add(new Staff("小王","002"));
StaffIterator iterator = staffAggregate.createIterator();
while (iterator.hasNext()){
Staff staff = iterator.next();
System.out.println(staff);
}
}
}
执行结果如下:
Staff{name='小明', jobNumber='001'}
Staff{name='小王', jobNumber='002'}
可以看到我们使用迭代器模式完成了优秀员工的遍历。
迭代器设计模式的优缺点
优点:
- 解耦数据结构和遍历算,法将集合对象和遍历逻辑分离,使得它们可以独立变化,集合对象只需要实现迭代器接口,而客户端只需要通过迭代器进行遍历操作,实现了解耦。
- 统一遍历接口,客户端可以使用相同的方式来来处理不同的集合对象,例如可以使用迭代器模式为遍历不同的数据结构,如数组、链表、树等。
优点:
- 增加系统复杂性,使用迭代器设计模式会增加类和接口,比如需要创建迭代器相关的类。
- 在某些场景下会增加性能开销,比如一些简单的数组的访问使用索引访问比使用迭代器访问更高效。
迭代器设计模式的使用场景
- 当要展示一组相似对象,或者遍历一组相同对象时候可以使用迭代器模式。
总结:本篇分享了迭代器设计模式的概念和使用方式,并用代码案例进行了简单演示,希望对不太熟悉迭代器模式的小伙伴们有一定的帮助。
如有不正确的地方欢迎各位指出纠正。
标签:遍历,迭代,--,模式,设计模式,public,Staff From: https://blog.csdn.net/weixin_42118323/article/details/144435924