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

    我们不一样
  • 相关阅读:
    TechRoad_oneStep_0509
    TechRoad_0417
    [Network] 判断设备是否能访问 Internet
    云原生相关知识点
    Algorithm: 多项式乘法 Polynomial Multiplication: 快速傅里叶变换 FFT / 快速数论变换 NTT
    Mac下配置Apache服务器
    解决antdv 中input每输入一个字符就失去焦点
    *装饰者模式(Decorator)
    *单例模式(singleton)
    ubuntu20.04 线缆已拔出
  • 原文地址:https://www.cnblogs.com/bug-mark/p/9649371.html
Copyright © 2020-2023  润新知