大话设计模式-迭代器模式-2020-10-22
2020-10-22 本文已影响0人
勇往直前888
定义
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
结构图
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();
}
}
- 测试界面
- 客户端代码
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