迭代器模式:按照顺序一次遍历集合中所有的元素

    优点:依序遍历元素,不会存在漏掉的情况

    实现:模拟一个公交车售票员售票的场景,不管车上乘客是什么人,坐车一律需要买票
    1、抽象迭代器、抽象集合类

    1. /**
    2. * 迭代抽象类
    3. */
    4. public abstract class Iterator {
    5. /**
    6. * 获取第一个对象
    7. */
    8. public abstract Object first();
    9. /**
    10. * 获取下一个对象
    11. */
    12. public abstract Object next();
    13. /**
    14. * 是否最后一个
    15. */
    16. public abstract Boolean idDone();
    17. /**
    18. * 获取当前对象
    19. */
    20. public abstract Object currentItem();
    21. }
    22. /**
    23. * 集合抽象类
    24. */
    25. public abstract class Aggregate {
    26. /**
    27. * 创建迭代器
    28. */
    29. public abstract Iterator createIterator();
    30. }

    2、具体迭代器、具体集合类

    1. /**
    2. * 具体迭代器
    3. */
    4. public class ConcreteIterator extends Iterator{
    5. //集合类
    6. private ConcreteAggregate aggregate;
    7. private int current = 0;
    8. public ConcreteIterator(ConcreteAggregate aggregate){
    9. this.aggregate = aggregate;
    10. }
    11. /**
    12. * 获取第一个对象
    13. */
    14. public Object first(){
    15. return aggregate.getItem(0);
    16. }
    17. /**
    18. * 获取下一个对象
    19. */
    20. public Object next(){
    21. Object next = null;
    22. current++;
    23. if (current < aggregate.count()){
    24. next = aggregate.getItem(current);
    25. }
    26. return next;
    27. }
    28. /**
    29. * 是否最后一个
    30. */
    31. public Boolean idDone(){
    32. return current < aggregate.count() ? false : true;
    33. }
    34. /**
    35. * 获取当前对象
    36. */
    37. public Object currentItem(){
    38. return aggregate.getItem(current);
    39. }
    40. }
    41. /**
    42. * 具体集合类
    43. */
    44. public class ConcreteAggregate extends Aggregate{
    45. private List<Object> item = new ArrayList<>();
    46. public Iterator createIterator(){
    47. return new ConcreteIterator(this);
    48. }
    49. public int count(){
    50. return item.size();
    51. }
    52. public Object getItem(int number){
    53. return item.get(number);
    54. }
    55. public void setItem(Object value){
    56. item.add(value);
    57. }
    58. }

    3、测试类

    1. /**
    2. * 测试迭代器模式
    3. */
    4. public class TestIterator {
    5. public static void main(String [] args){
    6. ConcreteAggregate concreteAggregate = new ConcreteAggregate();
    7. concreteAggregate.setItem("乘客1");
    8. concreteAggregate.setItem("乘客2");
    9. concreteAggregate.setItem("乘客3");
    10. concreteAggregate.setItem("公司员工");
    11. concreteAggregate.setItem("小偷");
    12. Iterator iterator = concreteAggregate.createIterator();
    13. Object item = iterator.first();
    14. System.out.println(MessageFormat.format("第一个乘客{0}", item));
    15. while (!iterator.idDone()){
    16. System.out.println(MessageFormat.format("{0}请买票" , iterator.currentItem()));
    17. iterator.next();
    18. }
    19. }
    20. }

    测试结果:
    image.png

    迭代器模式就是我们最常用的foreach,现在已经封装的很成熟了,不需要自己去写,在此只是了解一下其原理