正在学习Java语言迭代器,练习使用迭代器并自定义MyIterator接口达到以上逻辑。
主要思路:把组件分成两种CompositeComponent(复合组件)和AtomicComponent(原组件),它们继承自同一个抽象类(Component,复合组件有子代,子代再继续分两种。
public interface MyIterator {
boolean hasNext();
Component next();
}
abstract public class Component {
protected int id;
protected String name;
protected double price;
public Component(){
}
public Component(int id, String name,double price){
this.id = id;
this.name = name;
this.price = price;
}
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public double getPrice(){
return price;
}
public void setPrice(double price){
this.price = price;
}
public abstract void add(Component component) throws UnsupportedOperationException;
public abstract void remove(Component component) throws UnsupportedOperationException;
public abstract double calcPrice();
public abstract MyIterator iterator();
@Override
public boolean equals(Object ncp){
Component component = (Component)ncp;
if(!super.equals(component))
return false;
if(this.id==component.id)
return true;
else
return false;
}
@Override
public String toString(){
return "id:"+id+", name:"+name+", price"+price;
}
}
public class CompositeComponent extends Component {
protected ComponentList childs = new ComponentList();
public CompositeComponent() {
}
public CompositeComponent(int id, String name, double price) {
this.setId(id);
this.setName(name);
this.setPrice(price);
}
public ComponentList getChildren(){
return this.childs;
}
@Override
public void add(Component component) throws UnsupportedOperationException {
childs.add(component);
calcPrice();
}
@Override
public void remove(Component component) throws UnsupportedOperationException {
childs.remove(component);
}
@Override
public double calcPrice() {
double price = 0.0;
for(Component child:childs){
price += child.getPrice();
}
this.setPrice(price);
return this.getPrice();
}
@Override
public MyIterator iterator() {
MyIterator chit = new CompositeIterator(this);
return chit;
}
@Override
public String toString(){
StringBuffer components = new StringBuffer();
components.append("\n"+super.toString());
for(Component child:childs){
components.append("\n"+child.toString());
}
return components.toString();
}
}
###原组件
public class AtomicComponent extends Component {
public AtomicComponent(){
}
public AtomicComponent(int id,String name, double price){
this.setId(id);
this.setName(name);
this.setPrice(price);
toString();
}
@Override
public void add(Component component) throws UnsupportedOperationException {
}
@Override
public void remove(Component component) throws UnsupportedOperationException {
}
@Override
public double calcPrice() {
return this.price;
}
@Override
public MyIterator iterator() {
MyIterator nit =new NullIterator();
return nit;
}
@Override
public String toString(){
return super.toString();
}
}
public class CompositeIterator implements MyIterator {
protected ComponentList list = new ComponentList();
public CompositeIterator(Component c){
list.add(c);
}
@Override
public boolean hasNext() {
if(0== list.size()||list.isEmpty())
return false;
else
return true;
}
@Override
public Component next() {
if(hasNext()){
Component c = list.get(0);
System.out.println("id: "+c.getId()+", name:"+c.getName()+", price:"+c.getPrice());
if(list.get(0) instanceof CompositeComponent){
list.addAll( (((CompositeComponent) list.get(0)).getChildren()));
System.out.println("\nsub-components of "+list.get(0).name+":\n");
}
list.remove(0);
return c;
}
else
return null;
}
}
public class NullIterator implements MyIterator{
@Override
public boolean hasNext() {
return false;
}
@Override
public Component next() {
return null;
}
}
最后调用
public class Test {
public static void main(String[] args) {
int id = 0;
//计算对象
Component computer = new CompositeComponent(id++, "Think Pad",0.0);
//键盘对象
Component keyboard = new AtomicComponent(id++, "Keyboard",20.0);
//鼠标对象
Component mouse = new AtomicComponent(id++, "Mouse",20.0);
//显示器对象
Component monitor = new AtomicComponent(id++,"Monitor",1000.0)
//主机对象
Component mainFrame = new CompositeComponent(id++, "Main frame",0.0);
//硬盘对象
Component hardDisk = new AtomicComponent(id++, "Hard disk",1000.0);
//电源对象
Component powerSupplier = new AtomicComponent(id++, "Power supplier",500.0);
//主板对象
Component mainBoard = new CompositeComponent(id++, "Main board",0.0);
//CPU对象
Component cpu = new AtomicComponent(id++, "CPU",1500.0);
//显卡对象
Component videoCard = new AtomicComponent(id++, "Video card",900.0);
//网卡对象
Component networkCard = new AtomicComponent(id++, "Network card",100.0);
mainBoard.add(cpu);
mainBoard.add(videoCard);
mainBoard.add(networkCard);
mainFrame.add(hardDisk);
mainFrame.add(powerSupplier);
mainFrame.add(mainBoard);
computer.add(keyboard);
computer.add(mouse);
computer.add(monitor);
computer.add(mainFrame);
MyIterator it = computer.iterator();
while(it.hasNext()){
Component c = it.next();
}
}
}
新人上路,有更好的方法欢迎讨论。