首先设计一个能迭代对象的帮助类,再设计一个需要迭代的对象类,最后是客户端主类。
迭代帮助类:
package com.freshbin.pattern.composite.myexample;
import java.util.Iterator;
import java.util.Stack;
/**
* 迭代器
*
* @author freshbin
* @date 2019-1-8 19:47:39
*/
public class CompositeIterator implements Iterator {
private Stack<Iterator> stack = new Stack<>();
public CompositeIterator(Iterator iterator) {
stack.push(iterator);
}
@Override
public boolean hasNext() {
if(stack.empty()) {
return false;
}
Iterator iterator = stack.peek();
if(!iterator.hasNext()) {
stack.pop();
return hasNext();
} else {
return true;
}
}
@Override
public Object next() {
if(hasNext()) {
Iterator iterator = stack.peek();
Family family = (Family)iterator.next();
stack.push(family.getIterator());
return family;
}
return null;
}
}
迭代对象类:
package com.freshbin.pattern.composite.myexample;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 需要组合的对象
*
* @author freshbin
* @date 2019-1-8 19:47:15
*/
public class Family {
private String identify;
private List<Family> families;
public Family(String identify) {
this.identify = identify;
families = new ArrayList<>();
}
public void addFamily(Family family) {
families.add(family);
}
public void removeFamily(Family family) {
families.remove(family);
}
public Iterator<Family> getIterator() {
return new CompositeIterator(families.iterator());
}
public String getIdentify() {
return this.identify;
}
}
客户端主类:
package com.freshbin.pattern.composite.myexample;
import java.util.Iterator;
/**
* 组合模式
*
* @author freshbin
* @date 2019-1-8 19:28:15
*/
public class CompositePatternDemo {
public static void main(String[] args) {
Family grandPa = new Family( "爷爷");
Family father = new Family( "爸爸");
Family father2 = new Family( "爸爸二");
Family grandSon = new Family( "孙子");
father.addFamily(grandSon);
grandPa.addFamily(father2);
grandPa.addFamily(father);
display(grandPa);
System.out.println("==============");
grandPa.removeFamily(father2);
display(grandPa);
System.out.println("==============");
display(father);
}
public static void display(Family family) {
System.out.println(family.getIdentify());
Iterator<Family> families = family.getIterator();
while (families.hasNext()) {
Family familyDis = families.next();
System.out.println(familyDis.getIdentify());
}
}
}
效果图:
感觉有点类似遍历文件夹。