zoukankan      html  css  js  c++  java
  • IteratorPattern(迭代子模式)

    /**
     * 迭代子模式
     * @author TMAC-J
     * 聚合:某一类对象的集合
     * 迭代:行为方式,用来处理聚合
     * 是一种行为模式,用于将聚合本身和操作聚合的行为分离
     * Java中的COLLECT就是一种聚合,Iterator类是一种迭代
     * 好处:分开了行为和本身,便于行为的扩展和本身的维护,符合开闭原则
     * 分为白盒(宽接口)和黑盒(窄接口)
     * 白盒:白盒提供了一些可以访问聚合内部的方法,如getSize,add,remove等等
     * 黑盒:不提供或者提供很少外部访问的方法,对外部透明,就像一个黑盒,从外面看不到里面
     * 一般而言聚合可以提供一些工厂方法或者抽象工厂来创建不同的迭代
     * 下面的例子用黑盒来说明,因为我觉得黑盒相比于白盒来说分离的更开,耦合降为最低
     */
    public class IteratorPattern {
        
        abstract  class Aggregate {  
            
            private Object[] objs;
            
            public Aggregate(Object[] objs ) {
                this.objs = objs;
            }
            
            
            /**
             *  只提供Iterator的工厂方法,没有暴露其他方法给外部
             */
            abstract Iterator createIterator();  
        
        }  
        
        
        interface Iterator{
            
            void add(Object obj);
            
            void remove();
            
            int getSize();
            
        }
        
        public class ConcreteAggregate extends Aggregate{
            
            public ConcreteAggregate(Object[] objs) {
                super(objs);
                
            }
    
            @Override
            Iterator createIterator() {
                return new ConcreteIterator(this);
            }
    
            
            
        }
        
        public class ConcreteIterator implements Iterator{
            
            private int size;//aggregate的大小
            
            private int position;//指针(当时学的数据结构终于有用了.....)
            
            private Aggregate aggregate;
            
            public ConcreteIterator(Aggregate aggregate) {
                this.aggregate = aggregate;
            }
            
            @Override
            public synchronized void add(Object obj) {
                if(position<size){
                    aggregate.objs[position] = obj;
                    position++;
                    size++;
                }
                else{
                    System.out.println("当前聚合已满!");//正常情况下这里要写一个日志类...但太麻烦了,就不写了
                }
            }
    
            @Override
            public synchronized void remove() {
                if(position>0){
                    aggregate.objs[position-1] = null;
                    position--;
                    size--;
                }
                else{
                    System.out.println("当前聚合为空!");
                }
            }
    
            @Override
            public int getSize() {
                if(aggregate!=null)return aggregate.objs.length;
                return 0;
            }
            
        }
        
        public void test(){
            Object[] numbers = {1,2,3,4,5};
            Aggregate aggregate = new ConcreteAggregate(numbers);
            Iterator iterator = aggregate.createIterator();
            iterator.add(1);
            iterator.remove();
            iterator.getSize();
        }
        
    }
  • 相关阅读:
    如何将平时所学的代码知识,用在实际测试场景中
    CSS,XTHML书写规范以及常见问题总结
    网页底部定位
    时不我待
    用CSS设置Table的细边框的最好用的方法
    CSS Hack总结说明
    批处理轻松删除Win7下WINDOWS.OLD文件夹
    通过iframe调用页面的一部分,实现自己想要的页面
    超简单的javascript
    form在IE6中会影响样式的问题
  • 原文地址:https://www.cnblogs.com/yzjT-mac/p/6232293.html
Copyright © 2011-2022 走看看