美文网首页
大话设计模式-迭代器模式-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