zoukankan      html  css  js  c++  java
  • 设计模式【15】| 迭代子模式

     就是一个迭代器,用来遍历集合。java 原生代码中的迭代器也是采用这种模式

    1.程序设计

    出于更深入的了解java迭代器原理,自己写一遍还是有必要的。

           程序设计:两个接口,两个实现类。

           集合接口:构造集合的存储结构

           迭代器接口:用来对集合进行遍历。

           自己定义一个User的model ,自定义集合,并定义添加item的方法,然后通过自己定义的迭代器,对其进行遍历。是不是很溜呀。那我们开始吧。这个弯子有点大,多看几遍就明白了。

    集合接口: NotTrueCollection

    package com.cn.iteractor;
    
    public interface NotTrueCollection<T> {
    
    	NotTrueIteractor<T> createIteractor();
    
    	Object get(int i);
    
    	int size();
    
    	void addItem(T t);
    
    	void deleteItem(T t);
    
    } 

    迭代器接口: NotTrueIteractor

    package com.cn.iteractor;
    
    public interface NotTrueIteractor<T> {
    	
    	boolean hasNext();
    
    	Object getPrevious();
    
    	Object next();
    
    	Object getFirst();
    
    	Object getLasst();
    }

    集合实现类:MyCollection

    package com.cn.iteractor;
    
    public class MyCollection<T> implements NotTrueCollection<T> {
    
        private Object[] collections = new Object[1];
    
        private int index = 0;
    
        @Override
        public NotTrueIteractor<T> createIteractor() {
            return new MyIteractor<T>(this);
        }
    
        @Override
        public Object get(int i) {
            return collections[i];
        }
    
        @Override
        public int size() {
            return collections.length;
        }
    
        @Override
        public void addItem(T t) {
            int lengths = size();
            if (index >= size()) {
                Object[] collectionTemp = collections;
                collections = new Object[lengths + 1];
                for (int i = 0; i < collectionTemp.length; i++) {
                    collections[i] = collectionTemp[i];
                }
                collections[lengths] = t;
            } else {
                collections[lengths-1] = t;
            }
            index++;
        }
    
        @Override
        public void deleteItem(T t) {
            // TODO Auto-generated method stub
    
        }
    
    }

    迭代器实现类 MyIteractorimplements

    package com.cn.iteractor;
    
    public class MyIteractor<T> implements NotTrueIteractor<T> {
    
        private NotTrueCollection<T> notTrueCollectin;
    
        private int post = -1;
    
        public MyIteractor(NotTrueCollection<T> notTrueCollectin) {
            this.notTrueCollectin = notTrueCollectin;
        }
    
        @Override
        public boolean hasNext() {
            if (post < notTrueCollectin.size() - 1) {
                return true;
            }
            return false;
        }
    
        @Override
        public Object getPrevious() {
            if (post > 0) {
                post--;
            }
            return notTrueCollectin.get(post);
        }
    
        @Override
        public Object next() {
            if (post < notTrueCollectin.size() - 1) {
                post++;
            }
            return notTrueCollectin.get(post);
        }
    
        @Override
        public Object getFirst() {
            return notTrueCollectin.get(0);
        }
    
        @Override
        public Object getLasst() {
            return notTrueCollectin.get(notTrueCollectin.size() - 1);
        }
        
    }

    测试类: User

    package com.cn.iteractor;
    
    public class User {
    
        private String name;
        private String sex;
        private int age;
        private String address;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        @Override
        public String toString() {
            return "User [name=" + name + ", sex=" + sex + ", age=" + age + ", address=" + address + "]";
        }
    
    }

    测试结果:Test

    package com.cn.iteractor;
    
    public class Test {
    
        public static void main(String[] args) {
            NotTrueCollection<User> myCollection = new MyCollection<>();
            User user1 = new User();
            User user2 = new User();
            User user3 = new User();
            user1.setName("Harvey");
            user2.setName("Tom");
            user3.setName("Jack");
            myCollection.addItem(user1);
            myCollection.addItem(user2);
            myCollection.addItem(user3);
            NotTrueIteractor<User> iteractor = myCollection.createIteractor();
            while (iteractor.hasNext()) {
                User users = (User) iteractor.next();
                System.out.println(users);
            }
    
        }
    }

           说明:代码中User模型省略了getset还有toString()方法。另外遍历似乎只有在遍历集合的时候才需要,但是java 原生的代码已经将集合遍历完美的实现,我们只要理解其原理就行了。

    我们不一样
  • 相关阅读:
    快速编辑里指定默认值
    Odoo domain 中的 like, ilike, =like, =ilike 举例说明【转】
    odoo报表条码无法显示解决[转]
    ubuntu 安装 wkhtmltopdf 的方法
    解决Odoo日期(时间)无效的问题 [转]
    ShareSDK演示
    黑客帝国数字矩阵特效做法
    lua中实现倒计时
    Lua中用Split函数分割字符串
    lua封装的位运算
  • 原文地址:https://www.cnblogs.com/bug-mark/p/9649371.html
Copyright © 2011-2022 走看看