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 原生的代码已经将集合遍历完美的实现,我们只要理解其原理就行了。

    我们不一样
  • 相关阅读:
    解决xcode5升级后,Undefined symbols for architecture arm64:问题
    第8章 Foundation Kit介绍
    app 之间发送文件 ios
    iphone怎么检测屏幕是否被点亮 (用UIApplication的Delegate)
    CRM下载对象一直处于Wait状态的原因
    错误消息Customer classification does not exist when downloading
    How to resolve error message Distribution channel is not allowed for sales
    ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼
    有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中
    SAP GUI和Windows注册表
  • 原文地址:https://www.cnblogs.com/bug-mark/p/9649371.html
Copyright © 2011-2022 走看看