zoukankan      html  css  js  c++  java
  • 迭代器模式Iterators

    迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。 

    选用场合:

    1.访问一个聚合对象的内容而无需暴露它的内部表示。
    2.支持对聚合对象的多种遍历。
    3.为遍历不同的聚合结构提供一个统一的接口(即,多态迭代)。

    迭代器模式由以下角色组成:

    1)迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。

    2)具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。

    3)容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。

    4)具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口??这个具体迭代器角色于该容器的结构相关。

    package com.qinsoft.design;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Iterators:行为型
     */
    public class Iterators {
        public static void main(String[] args) {
            // 聚集对象(公交车)
            ConcreteAggregate a = new ConcreteAggregate();
            
            // 对象集合(新上来的乘客)
            List<Object> items = new ArrayList<Object>();
            items.add("大鸟");
            items.add("小菜");
            items.add("行李");
            items.add("老外");
            items.add("公交内部员工");
            items.add("小偷");        
            a.setItems(items);
            
            // 迭代器对象
            Iterator i = new ConcreteIterator(a);
            
            // 迭代器第一个对象(从第一个乘客开始)
            while(!i.isDone()){
                System.out.println(i.currentItem()+"请买车票");
                i.next();
            }
            System.out.println("------------反向遍历---------------");
            
            //-----反向遍历-------------------
            Iterator iDesc = new ConcreteIteratorDesc(a);
            // 迭代器第一个对象(从最后一个乘客开始)
            while(!iDesc.isDone()){
                System.out.println(iDesc.currentItem()+"请买车票");
                iDesc.next();
            }
        }
    }
    /**
     * 聚集抽象类
     */
    abstract class Aggregate {
        // 创建迭代器
        public abstract Iterator createIteraotr();
    
    }
    /**
     * 具体的聚集类,继承聚集抽象类Aggregate
     */
    class ConcreteAggregate extends Aggregate{
    
        // 声明一个List泛型变量,用于存放聚合对象
        private List<Object> items = new ArrayList<Object>();
        @Override
        public Iterator createIteraotr() {        
            return new ConcreteIterator(this);
        }
        // 返回集合总个数
        public int count(){
            return items.size();
        }
        public List<Object> getItems() {
            return items;
        }
        public void setItems(List<Object> items) {
            this.items = items;
        }
    }
    /**
     * 迭代器抽象类
     */
    abstract class Iterator {
        
        // 开始对象
        public abstract Object first();
        // 下一个对象
        public abstract Object next();
        // 当前对象
        public abstract Object currentItem();
        // 是否到结尾
        public abstract boolean isDone();
    }
    /**
     * 具体的迭代器类,继承迭代器抽象类Iterator
     */
    class ConcreteIterator extends Iterator{
        
        // 定义一个具体的聚集对象
        private ConcreteAggregate aggregate;
        private int current =0 ;
        
        // 初始化时将具体的聚集对象传入
        public ConcreteIterator(ConcreteAggregate aggregate){
            this.aggregate =aggregate;
        }
    
        @Override
        public Object currentItem() {
            // 返回当前的聚集对象
            return aggregate.getItems().get(current);
        }
    
        @Override
        public Object first() {
            // 得到聚集的第一个对象
            return aggregate.getItems().get(0);
        }
    
        @Override
        public boolean isDone() {
            // 判断当前是否遍历到结尾,到结尾返回true
            return current>=aggregate.count()?true:false;
        }
    
        @Override
        public Object next() {
            
            // 得到聚集的下一个对象
            Object ref = null;
            current++;
            if(current<aggregate.count()){
                ref = aggregate.getItems().get(current);
            }
            return ref;
        }
    }
    /**
     * 反向遍历的具体的迭代器类,继承迭代器抽象类Iterator
     */
    class ConcreteIteratorDesc extends Iterator{
        
        // 定义一个具体的聚集对象
        private ConcreteAggregate aggregate;
        private int current =0 ;
        
        // 初始化时将具体的聚集对象传入
        public ConcreteIteratorDesc(ConcreteAggregate aggregate){
            this.aggregate =aggregate;
            current = aggregate.count()-1;
        }
    
        @Override
        public Object currentItem() {
            // 返回当前的聚集对象
            return aggregate.getItems().get(current);
        }
    
        @Override
        public Object first() {
            // 得到聚集的第一个对象
            return aggregate.getItems().get(aggregate.count()-1);
        }
    
        @Override
        public boolean isDone() {
            // 判断当前是否遍历到结尾,到结尾返回true
            return current<0?true:false;
        }
    
        @Override
        public Object next() {
            
            // 得到聚集的下一个对象
            Object ref = null;
            current--;
            if(current>=0){
                ref = aggregate.getItems().get(current);
            }
            return ref;
        }
    }
  • 相关阅读:
    LeetCode "Palindrome Partition II"
    LeetCode "Longest Substring Without Repeating Characters"
    LeetCode "Wildcard Matching"
    LeetCode "Best Time to Buy and Sell Stock II"
    LeetCodeEPI "Best Time to Buy and Sell Stock"
    LeetCode "Substring with Concatenation of All Words"
    LeetCode "Word Break II"
    LeetCode "Word Break"
    Some thoughts..
    LeetCode "Longest Valid Parentheses"
  • 原文地址:https://www.cnblogs.com/hnhcc39/p/2625308.html
Copyright © 2011-2022 走看看