• 设计模式之迭代器模式java实现代码


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

    迭代器模式提供了一种方法,可以顺序访问一个聚合对象中的元素,而又不用知道内部是如何标示的。另外,迭代器模式把在元素之间游走的责任交给迭代器,而不是聚合对象,让聚合更专注于数据集合。

    案例实现情景:我和友人去超市分头购物,在结帐时,我们遍历一下我们的 “扫货” 清单(遍历打印购物清单),在实现上,Me使用ArrayList,友人使用Thing[]数组,给遍历造成困扰。

    案例代码:

    Thing.java

    public class Thing {
    	private String name;
    	private long price;
    	public Thing(String name,long price){
    		this.name = name;
    		this.price = price;
    	}
    	@Override
    	public String toString() {
    		return "Thing [name=" + name + ", price=" + price + "]";
    	}
    	
    }
    


    Me.java

    import java.util.ArrayList;
    import java.util.Iterator;
    
    
    public class Me {
    	private ArrayList<Thing> shopping = new ArrayList<Thing>();
    	
    	public Me(){
    		shopping.add(new Thing("巧克力", 35));
    		shopping.add(new Thing("凉茶", 4));
    		shopping.add(new Thing("袜子", 9));
    		shopping.add(new Thing("香蕉", 12));
    	}
    	
    	public Iterator<Thing> createIterator(){
    		return shopping.iterator();
    	}
    }
    

    Friends.java

    import java.util.Iterator;
    
    
    public class Friends {
    	private Thing[] shopping = new Thing[100];
    	
    	public Friends(){
    		shopping[0] = new Thing("牛奶",15);
    		shopping[1] = new Thing("苹果",10);
    		shopping[2] = new Thing("薯片",4);
    	}
    	
    	public Iterator<Thing> createIterator(){
    		return new ArrayIterator(shopping);
    	}
    }
    


    ArrayIterator.java

    import java.util.Iterator;
    
    
    public class ArrayIterator implements Iterator<Thing>{
    	private Thing[] thingArray;
    	private int position = 0;
    	public ArrayIterator(Thing[] array){
    		thingArray = array;
    	}
    	
    	@Override
    	public boolean hasNext() {
    		while(position<thingArray.length && thingArray[position] != null){
    			return true;
    		}
    		return false;
    	}
    
    	@Override
    	public Thing next() {
    		return thingArray[position++];
    	}
    
    	@Override
    	public void remove() {
    		//noting to do 
    	}
    
    }
    


    Test.java

    import java.security.AllPermission;
    import java.util.ArrayList;
    import java.util.Iterator;
    
    
    public class Test {
    	public static void main(String args[]){
    		ArrayList<Iterator<Thing>> allIterator = new ArrayList<Iterator<Thing>>();
    		Me me = new Me();
    		Friends friends = new Friends();
    		
    		Iterator<Thing> meIterator = me.createIterator();
    		Iterator<Thing> friendsIterator = friends.createIterator();
    		allIterator.add(meIterator);
    		allIterator.add(friendsIterator);
    		
    		for(Iterator<Thing> iterator:allIterator){
    			while(iterator.hasNext()){
    				System.out.println(iterator.next());
    			}
    			System.out.println("---------------------");
    		}
    	}
    }
    


    测试结果:

    Thing [name=巧克力, price=35]
    Thing [name=凉茶, price=4]
    Thing [name=袜子, price=9]
    Thing [name=香蕉, price=12]
    ---------------------
    Thing [name=牛奶, price=15]
    Thing [name=苹果, price=10]
    Thing [name=薯片, price=4]
    ---------------------
    


    总结:

    设计原则:

    单一职责:一个类应该只有一个引起变化的职责。

    当一个模块或一个类被设计成只支持一组相关的功能时,我们说它具有高内聚。


  • 相关阅读:
    【算法学习笔记】27.动态规划 解题报告 SJTU OJ 1254 传手绢
    【算法学习笔记】26.扫描维护法 解题报告 SJTU OJ 1133 数星星
    【算法学习笔记】25.贪心法 均分纸牌问题的分析
    【算法学习笔记】24.记忆化搜索 解题报告 SJTU OJ 1002 二哥种花生
    【算法学习笔记】23.动态规划 解题报告 SJTU OJ 1280 整装待发
    【算法学习笔记】22.算法设计初步 二分查找 上下界判断
    【算法学习笔记】21.算法设计初步 求第k个数 划分法 快排法
    【算法学习笔记】20.算法设计初步 归并排序 求逆序数
    【算法学习笔记】19.算法设计初步 最大子列和问题的几种方法
    【算法学习笔记】18.暴力求解法06 隐式图搜索2 八数码问题 未启发
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3028613.html
Copyright © 2020-2023  润新知