美文网首页
大话设计模式-迭代器模式-2020-10-22

大话设计模式-迭代器模式-2020-10-22

作者: 勇往直前888 | 来源:发表于2020-10-22 17:50 被阅读0次

    定义

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

    结构图

    image.png

    使用场景

    • 当你需要访问一个聚焦对象,而且不管这些对象是什么都需要遍历的时候,就应该选择使用迭代器模式。

    • 当你需要对聚集有多种方式遍历时,可以考虑用迭代模式。

    • 为遍历不同的聚合结构提供如开始,下一个,是否结束,当前哪一项等统一的接口。

    售票员的例子

    • Iterator,抽象类,定义迭代器接口
    abstract class Iterator {
        public abstract Object first();
        public abstract Object next();
        public abstract Boolean isDone();
        public abstract Object currentItem();
    }
    
    • ConcreteIterator具体的迭代器
    class ConcreteIterator extends Iterator {
        private ConcreteAggregate aggregate;
        private int current = 0;
    
        public ConcreteIterator(ConcreteAggregate aggregate) {
            this.aggregate = aggregate;
        }
    
        @Override
        public Object first() {
            return aggregate.objectAtIndex(0);
        }
    
        @Override
        public Object next() {
            current++;
            return aggregate.objectAtIndex(current);
        }
    
        @Override
        public Boolean isDone() {
            return (current >= aggregate.count) ? true : false;
        }
    
        @Override
        public Object currentItem() {
            return aggregate.objectAtIndex(current);
        }
    }
    
    • Aggregate;抽象集合类,定义迭代器创建的接口
    abstract class Aggregate {
        public abstract Iterator createIterator();
    }
    
    • ConcreteAggregate具体的结合类,这里简单地包了一个ArrayList
    class ConcreteAggregate extends Aggregate {
        private ArrayList<Object> items = new ArrayList<Object>();
    
        // 集合个数,只提供getter
        public int count;
    
        @Override
        public Iterator createIterator() {
            return new ConcreteIterator(this);
        }
    
        // 通过下标访问元素
        public Object objectAtIndex(int index) {
            if (index < count) {
                return items.get(index);
            } else {
                return null;
            }
        }
    
        // 添加元素
        public void add(Object object) {
            items.add(object);
            count = items.size();
        }
    }
    
    • 测试界面
    image.png
    • 客户端代码
    public class IteratorActivity extends AppCompatActivity {
    
        public static void launch(Context context) {
            if (null != context) {
                Intent intent = new Intent();
                intent.setClass(context, IteratorActivity.class);
                if (!(context instanceof Activity)) {
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                }
                context.startActivity(intent);
            }
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_iterator);
            setTitle("迭代器模式");
    
            TextView ticketTextView = findViewById(R.id.textViewTicket);
    
            ConcreteAggregate aggregate = new ConcreteAggregate();
    
            aggregate.add("大鸟");
            aggregate.add("小菜");
            aggregate.add("行李");
            aggregate.add("老外");
            aggregate.add("公交内部员工");
            aggregate.add("小偷");
    
            ConcreteIterator iterator = new ConcreteIterator(aggregate);
            String message = "";
            while (!iterator.isDone()) {
                message += iterator.currentItem() + " ====== 请买车票"  + "\n";
                iterator.next();
            }
            ticketTextView.setText(message);
        }
    }
    

    Demo地址

    https://gitee.com/zhangxusong888/Android/tree/master/design_pattern

    相关文章

      网友评论

          本文标题:大话设计模式-迭代器模式-2020-10-22

          本文链接:https://www.haomeiwen.com/subject/acaumktx.html