一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。分为:宽接口聚集,又叫做白盒聚合;窄接口聚合,又叫做黑盒聚合;区别在于白盒聚合向外部提供了操作聚合元素的方法。
白盒聚合
/**
* * 外部迭代接口
*/
public interface Iterator {
boolean hasNext();
String next();
}
public interface Aggregate {
Iterator getIterator();
}
public class FruitIterator implements Iterator {
private int size;
private int index;
private FruitAggregate fruitAggregate;
public FruitIterator(FruitAggregate fruitAggregate) {
this.size = fruitAggregate.getSize();
this.index = 0;
this.fruitAggregate = fruitAggregate;
}
@Override
public boolean hasNext() {
return index < size;
}
@Override
public String next() {
return fruitAggregate.getFruit(index++);
}
}
public class FruitAggregate implements Aggregate {
private List<String> fruits;
public FruitAggregate(List<String> fruits) {
this.fruits = fruits;
}
@Override
public Iterator getIterator() {
return new FruitIterator(this);
}
// 以下是对外提供的操作聚合元素的方法
public int getSize() {
return fruits.size();
}
public String getFruit(int index) {
return fruits.get(index);
}
}
@Test
public void WhiteIteratorTest() {
String[] fruitArray = {"apple", "banana", "strawberry"};
List<String> fruits = new ArrayList<String>(Arrays.asList(fruitArray));
FruitAggregate fruitAggregate = new FruitAggregate(fruits);
Iterator iterator = fruitAggregate.getIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
黑盒聚合
public class FruitAggregate implements Aggregate {
private List<String> fruits;
public FruitAggregate(List<String> fruits) {
this.fruits = fruits;
}
@Override
public Iterator getIterator() {
return new FruitIterator();
}
// 内部类
private class FruitIterator implements Iterator {
private int size;
private int index;
public FruitIterator() {
this.size = fruits.size();
this.index = 0;
}
@Override
public boolean hasNext() {
return index < size;
}
@Override
public String next() {
return fruits.get(index++);
}
}
}
@Test
public void WhiteIteratorTest() {
String[] fruitArray = {"apple", "banana", "strawberry"};
List<String> fruits = new ArrayList<String>(Arrays.asList(fruitArray));
FruitAggregate fruitAggregate = new FruitAggregate(fruits);
Iterator iterator = fruitAggregate.getIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}