响应式品牌网站设计,mvc5 网站开发美学 pdf,二维码生成器小程序,如何让网站给百度收录迭代器模式
迭代器模式也是非常的简单#xff0c;定义如下#xff1a; 提供一个对象来顺序访问聚合对象中的一系列数据#xff0c;而不暴露聚合对象的内部表示。 相信大家都使用过类似下面的迭代器#xff1a;
ListString list new ArrayList();
Iterat…迭代器模式
迭代器模式也是非常的简单定义如下 提供一个对象来顺序访问聚合对象中的一系列数据而不暴露聚合对象的内部表示。 相信大家都使用过类似下面的迭代器
ListString list new ArrayList();
IteratorString iterator list.iterator(); //list.iterator()方法返回的肯定是Iterator接口的子实现类对象
while (iterator.hasNext()) {System.out.println(iterator.next());
}如果在你的项目中需要对一个自定义的集合进行迭代遍历那么迭代器模式是非常需要学习的。迭代器模式主要包含以下角色 抽象聚合Aggregate角色定义存储、添加、删除聚合元素以及创建迭代器对象的接口。 具体聚合ConcreteAggregate角色实现抽象聚合类返回一个具体迭代器的实例。 抽象迭代器Iterator角色定义访问和遍历聚合元素的接口通常包含 hasNext()、next() 等方法。 具体迭代器Concretelterator角色实现抽象迭代器接口中所定义的方法完成对聚合对象的遍历记录遍历的当前位置。
案例实现
【例】定义一个可以存储学生对象的容器对象将遍历该容器的功能交由迭代器实现涉及到的类如下
代码如下
首先定义Student对象如下
public class Student {private String name;private int age;public Student(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}Overridepublic String toString() {return Student{ name name \ , age age };}
}然后定义Student类迭代器接口主要就判断是否还有下一个元素和获取下一个元素两个方法如下
public interface StudentIterator {boolean hasNext();Student next();
}然后实现学生类迭代器接口就好如下
public class StudentIteratoirImpl implements StudentIterator{private ListStudent list;private int position 0;public StudentIteratoirImpl(ListStudent list){this.list list;}Overridepublic boolean hasNext() {return positionlist.size();}Overridepublic Student next() {Student student list.get(position);position;return student;}
}其实到这里我们就已经完成了迭代器功能了可以使用下面的代码测试迭代器如下
public class Main {public static void main(String[] args) {// 测试迭代器类ArrayListStudent students new ArrayList();students.add(new Student(张三,17));students.add(new Student(李四,19));students.add(new Student(王五,18));StudentIteratoirImpl iter new StudentIteratoirImpl(students);while (iter.hasNext()){Student s iter.next();System.out.println(s);}}
}但是我们定义的是Student迭代器模型上面的迭代器仅仅是实现了基础功能如何需要的话我们可以将添加学生对象和删除学生对象的以及迭代的功能封装到一个容器类中当然这部分内容属于扩展内容如下
// 定义学生容器接口
public interface StudentContainer {// 添加学生的操作void addStudent(Student student);// 移除学生void removeStudent(Student student);// 获取学生迭代器StudentIterator getStudentIterator();
}// 实现学生容器接口
public class StudentContainerImpl implements StudentContainer{private ListStudent list new ArrayListStudent();Overridepublic void addStudent(Student student) {list.add(student);}Overridepublic void removeStudent(Student student) {list.remove(student);}Overridepublic StudentIterator getStudentIterator() {return new StudentIteratoirImpl(list);}
}客户类测试
public class Main {public static void main(String[] args) {// 测试迭代器类ArrayListStudent students new ArrayList();students.add(new Student(张三,17));students.add(new Student(李四,19));students.add(new Student(王五,18));StudentIteratoirImpl iter new StudentIteratoirImpl(students);while (iter.hasNext()){Student s iter.next();System.out.println(s);}System.out.println(---------------------);// 测试学生容器类StudentContainerImpl studentContainer new StudentContainerImpl();studentContainer.addStudent(new Student(张三,17));studentContainer.addStudent(new Student(李四,19));studentContainer.addStudent(new Student(王五,18));StudentIterator studentIterator studentContainer.getStudentIterator();while (studentIterator.hasNext()){Student s studentIterator.next();System.out.println(s);}}
}输出结果 Student{name‘张三’, age17} Student{name‘李四’, age19} Student{name‘王五’, age18} --------------------- Student{name‘张三’, age17} Student{name‘李四’, age19} Student{name‘王五’, age18} 优点
它支持以不同的方式遍历一个聚合对象在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法我们也可以自己定义迭代器的子类以支持新的遍历方式。迭代器简化了聚合类。由于引入了迭代器在原有的聚合对象中不需要再自行提供数据遍历等方法这样可以简化聚合类的设计。在迭代器模式中由于引入了抽象层增加新的聚合类和迭代器类都很方便无须修改原有代码满足 “开闭原则” 的要求。
缺点
增加了类的个数这在一定程度上增加了系统的复杂性。
使用场景
当需要为聚合对象提供多种遍历方式时。当需要为遍历不同的聚合结构提供一个统一的接口时。当访问一个聚合对象的内容而无须暴露其内部细节的表示时。
参考内容 传智播客设计模式相关笔记主要