设计模式(行为型设计模式——迭代器模式)
迭代器模式
基本定义
模式结构
代码实现
Aggregate 抽象容器类
public interface Aggregate {
void add(Object object);
Object get(int index);
int getSize();
Iterator iterator();
}
ConcreteAggregate 具体容器对象
@Slf4j
public class ConcreteAggregate implements Aggregate {
private Object[] arr;
private int size;
private int index;
private int ARRAY_LENGTH;
public ConcreteAggregate() {
size = 0;
index = 0;
ARRAY_LENGTH = 10;
arr = new Object[ARRAY_LENGTH];
}
@Override
public void add(Object object) {
arr[index++] = object;
size++;
grow();
}
private void grow() {
double percent = new BigDecimal(size).divide(new BigDecimal(ARRAY_LENGTH)).doubleValue();
if(percent > 0.8){
ARRAY_LENGTH *= 2;
if(ARRAY_LENGTH > Integer.MAX_VALUE){
ARRAY_LENGTH = Integer.MAX_VALUE;
}
Object[] newArr = new Object[ARRAY_LENGTH];
System.arraycopy(arr, 0, newArr, 0, size);
arr = newArr;
}
}
@Override
public Object get(int index) {
return arr[index];
}
@Override
public int getSize() {
return size;
}
@Override
public Iterator iterator() {
return new ConcreteIterator(this);
}
}
Iterator:迭代器角色
public interface Iterator {
boolean hasNext();
Object next();
}
ConcreteIterator 具体的迭代器
public class ConcreteIterator implements Iterator {
private Aggregate aggregate;
private int index;
public ConcreteIterator(Aggregate aggregate) {
this.aggregate = aggregate;
}
@Override
public boolean hasNext() {
if(index >= aggregate.getSize()){
return false;
}
return true;
}
@Override
public Object next() {
Object object = aggregate.get(index);
index++;
return object;
}
}
Test 测试类
@Slf4j
public class Test {
public static void main(String[] args) {
Aggregate aggregate = new ConcreteAggregate();
aggregate.add("宋江");
aggregate.add("武松");
Iterator iterator = aggregate.iterator();
log.info("aggregate size {}", aggregate.getSize());
while (iterator.hasNext()){
log.info("{}", iterator.next());
}
}
}
输出结果
优点
应用场景
总结