zoukankan      html  css  js  c++  java
  • 迭代器模式(Iterator)

    @@@模式定义:
    提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。

    @@@练习示例: 
    工资表数据的整合

    @@@示例代码:
    patternPayModel.java

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    package pattern;
    
    /**
     * 工资描述模型对象
     */
    public class PayModel {
        /**
         * 支付工资的人员
         */
    	private String userName;
    	
    	/**
    	 * 支付工资的数额
    	 */
    	private double pay;
    
    	public String getUserName() {
    		return userName;
    	}
    
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    
    	public double getPay() {
    		return pay;
    	}
    
    	public void setPay(double pay) {
    		this.pay = pay;
    	}
    	
    	public String toString() {
    		return "userName=" + userName + ", pay=" + pay;
    	}
    }


    patternIterator.java
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    package pattern;
    
    /**
     * 迭代器接口,定义访问和遍历元素的操作
     */
    public interface Iterator {
        /**
         * 移动到聚合对象的第一个位置
         */
    	public void first();
    	
    	/**
    	 * 移动到聚合对象的下一个位置
    	 */
    	public void next();
    	
    	/**
    	 * 判断是否已经移动到聚合对象的最后一个位置
    	 * @return true 表示已经移动到聚合对象的最后一个位置
    	 *         false 表示还没有移动到聚合对象的最后一个位置
    	 */
    	public boolean isDone();
    	
    	/**
    	 * 获取迭代的当前元素
    	 * @return 迭代的当前元素
    	 */
    	public Object currentItem();
    }
    


    patternCollectionIteratorImpl.java
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    package pattern;
    
    /**
     * 用来实现访问Collection集合的迭代接口,为了外部统一访问方式
     */
    public class CollectionIteratorImpl implements Iterator {
    	/**
         * 用来存放被迭代的聚合对象
         */
    	private PayManager aggregate = null;
    	
    	/**
    	 * 用来记录当前迭代到的位置索引
    	 * -1表示刚开始的时候,迭代器指向对和对象第一个对象之前
    	 */
    	private int index = -1;
    	
    	public CollectionIteratorImpl(PayManager aggregate) {
    		this.aggregate = aggregate;
    	}
    
    	@Override
    	public void first() {
            index = 0;
    	}
    
    	@Override
    	public void next() {
            if (index < this.aggregate.size()) {
            	index = index + 1;
            }
    	}
    	
    	@Override
    	public boolean isDone() {
    		if (index == this.aggregate.size()) {
    			return true;
    		}
    		
    		return false;
    	}
    
    	@Override
    	public Object currentItem() {
    		return this.aggregate.get(index);
    	}
    }


    patternArrayIteratorImpl.java
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    package pattern;
    
    /**
     * 用来实现访问数组的迭代接口
     */
    public class ArrayIteratorImpl implements Iterator {
        /**
         * 用来存放被迭代的聚合对象
         */
    	private SalaryManager aggregate = null;
    	
    	/**
    	 * 用来记录当前迭代到的位置索引
    	 * -1表示刚开始的时候,迭代器指向对和对象第一个对象之前
    	 */
    	private int index = -1;
    	
    	public ArrayIteratorImpl(SalaryManager aggregate) {
    		this.aggregate = aggregate;
    	}
    
    	@Override
    	public void first() {
            index = 0;
    	}
    
    	@Override
    	public void next() {
            if (index < this.aggregate.size()) {
            	index = index + 1;
            }
    	}
    
    	@Override
    	public boolean isDone() {
    		if (index == this.aggregate.size()) {
    			return true;
    		}
    		
    		return false;
    	}
    	
    	@Override
    	public Object currentItem() {
    		return this.aggregate.get(index);
    	}
    }


    patternAggregate.java
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    package pattern;
    
    public abstract class Aggregate {
        /**
         * 工厂方法,创建相应迭代器对象的接口
         * @return 相应迭代器对象的接口
         */
        public abstract Iterator createIterator();
    }


    patternPayManager.java
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    package pattern;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 客户方已有的工资管理对象
     */
    public class PayManager extends Aggregate {
        /**
         * 聚合对象,这里是Java的集合对象
         */
    	private List list = new ArrayList();
    	
    	/**
    	 * 获取工资列表
    	 */
    	public List getPayList() {
    		return list;
    	}
    	
    	/**
    	 * 计算工资,其实应该有很多参数,此处从简
    	 */
    	public void calcPay() {
    		// 计算工资,并把工资信息填充到工资列表中
    		// 为了测试,输入些数据进去
    		PayModel pm1 = new PayModel();
    		pm1.setPay(3000);
    		pm1.setUserName("张三");
    		PayModel pm2 = new PayModel();
    		pm2.setPay(5000);
    		pm2.setUserName("李四");
    		
    		list.add(pm1);
    		list.add(pm2);
    	}
    	
    	public Iterator createIterator() {
    		return new CollectionIteratorImpl(this);
    	}
    	
    	public Object get(int index) {
    		Object retObj = null;
    		if (index < this.list.size()) {
    			retObj = this.list.get(index);
    		}
    		
    		return retObj;
    	}
    	
    	public int size() {
    		return this.list.size();
    	}
    }


    patternSalaryManager.java
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    package pattern;
    
    /**
     * 被客户方收购的那个公司的工资管理类
     */
    public class SalaryManager extends Aggregate {
        /**
         * 用数组管理
         */
    	private PayModel[] pms = null;
    	
    	/**
    	 * 获取工资列表
    	 * @return 工资列表
    	 */
    	public PayModel[] getPays() {
    		return pms;
    	}
    	
    	/**
    	 * 计算工资,其实应该有很多参数,此处从简
    	 */
    	public void calcSalary() {
    		// 计算工资,并把工资信息填充到工资列表中
    		// 为了测试,输入些数据进去
    		PayModel pm1 = new PayModel();
    		pm1.setPay(2200);
    		pm1.setUserName("王五");
    		PayModel pm2 = new PayModel();
    		pm2.setPay(3600);
    		pm2.setUserName("赵六");
    		
    		pms = new PayModel[2];
    		pms[0] = pm1;
    		pms[1] = pm2;
    	}
    	
    	public Iterator createIterator() {
    		return new ArrayIteratorImpl(this);
    	}
    	
    	public Object get(int index) {
    		Object retObj = null;
    		if (index < pms.length) {
    			retObj = pms[index];
    		}
    		
    		return retObj;
    	}
    	
    	public int size() {
    		return this.pms.length;
    	}
    }


    userClient.java
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    package user;
    
    import pattern.Iterator;
    import pattern.PayManager;
    import pattern.SalaryManager;
    
    public class Client {
    	public static void main(String[] args) {
            // 访问集团的工资列表
    		PayManager payManager = new PayManager();
    		// 先计算再获取
    		payManager.calcPay();
    		System.out.println("集团工资列表:");
    		test(payManager.createIterator());
    		
    		// 访问新收购公司的工资列表
    		SalaryManager salaryManager = new SalaryManager();
    		// 先计算再获取
    		salaryManager.calcSalary();
    		System.out.println("新收购的公司工资列表");
    		test(salaryManager.createIterator());
    	}
    	
    	/**
    	 * 测试通过访问聚合对象的迭代器,是否能正常访问聚合对象
    	 * @param it 聚合对象的迭代器
    	 */
    	private static void test(Iterator it) {
    		// 循环输出聚合对象中的值
    		// 首先设置迭代器到第一个元素
    		it.first();
    		while(!it.isDone()) {
    			// 取出当前元素
    			Object obj = it.currentItem();
    			System.out.println("the obj==" + obj);
    			// 如果还没有迭代到最后,那么就向下迭代一个
    			it.next();
    		}
    	}
    }
    


    @@@模式的实现:
    1. 迭代器围绕着“访问”可以延伸出许多功能;
    2. 有内部迭代器和外部迭代器之分;

    @@@模式的优点:
    1. 更好的封装性;
    2. 可以以不同的遍历方式来遍历一个聚合;
    3. 迭代器简化了聚合的接口;
    4. 简化客户端调用;
    5. 同一个聚合上可以有多个遍历

    @@@模式的缺点:
    NA

    @@@模式的本质:
    控制访问聚合对象中的元素。

    @@@模式体现的设计原则:
    单一职责原则

  • 相关阅读:
    DRF的Filter:字段过滤,查找,排序
    DRF的ViewSet和Router
    DRF的APIView和mixins+GenericAPIView和ListAPIView
    DRF的Serializer和ModelSerializer
    html5中的drag
    excel与json转换
    call和bind的原生实现
    将字符串转化为条形码,在将canvas转化为图片
    JSON与excel之间的相互转化(Vue)
    js实现点击复制,将内容复制至剪贴板
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3206660.html
Copyright © 2011-2022 走看看