Composite

来源:互联网 发布:评价小二黑结婚知乎 编辑:程序博客网 时间:2024/05/18 02:02
package designPatterns;

import java.util.*;

abstract class Equipment {
    
private String name;

    
public abstract double netPrice();

    
public abstract double discountPrice();

    
public boolean add(Equipment equipment) {
        
return false;
    }


    
public boolean remove(Equipment equipment) {
        
return false;
    }


    
public Iterator iter() {
        
return null;
    }


    
public Equipment(final String name) {
        
this.name = name;
    }

}


class Disk extends Equipment {
    
public Disk(String name) {
        
super(name);
    }


    
public double netPrice() {
        
return 1.;
    }


    
public double discountPrice() {
        
return .5;
    }

}


abstract class CompositeEquipment extends Equipment {
    
private int i = 0;

    
private List equipment = new ArrayList();

    
public CompositeEquipment(String name) {
        
super(name);
    }


    
public boolean add(Equipment equipment) {
        
this.equipment.add(equipment);
        
return true;
    }


    
public double netPrice() {
        
double netPrice = 0.;
        Iterator iter 
= equipment.iterator();
        
while (iter.hasNext())
            netPrice 
+= ((Equipment) iter.next()).netPrice();
        
return netPrice;
    }


    
public double discountPrice() {
        
double discountPrice = 0.;
        Iterator iter 
= equipment.iterator();
        
while (iter.hasNext())
            discountPrice 
+= ((Equipment) iter.next()).discountPrice();
        
return discountPrice;
    }


    
public Iterator iter() {
        
return equipment.iterator();
    }


    
public boolean hasNext() {
        
return i < equipment.size();
    }


    
public Object next() {
        
if (hasNext())
            
return equipment.get(i++);
        
else
            
throw new NoSuchElementException();
    }


}


class Chassis extends CompositeEquipment {
    
public Chassis(String name) {
        
super(name);
    }


    
public double netPrice() {
        
return 1+ super.netPrice();
    }


    
public double discountPrice() {
        
return .5 + super.discountPrice();
    }

}


class Cabinet extends CompositeEquipment {
    
public Cabinet(String name) {
        
super(name);
    }


    
public double netPrice() {
        
return 1+ super.netPrice();
    }


    
public double discountPrice() {
        
return .5 + super.discountPrice();
    }

}


public class CompositeTest {
    
public static void main(String[] args) {

        Cabinet cabinet 
= new Cabinet("Tower");

        Chassis chassis 
= new Chassis("PC Chassis");

        cabinet.add(chassis);

        chassis.add(
new Disk("10 GB"));

        System.out.println(
"netPrice=" + cabinet.netPrice());
        System.out.println(
"discountPrice=" + cabinet.discountPrice());

    }

}