Basic implementation:
// :: Component :: //
interface Component{
public function operation():Void;
}
// :: Leaf :: //
class Leaf implements Component{
private var number:Number;
public function Leaf(aNumber:Number){
number = aNumber;
}
public function operation():Void{
trace(”Leaf ” + number + “: operation“);
}
}
// :: Composite :: //
class Composite implements Component{
private var children:Array;
public function Composite(){
children = new Array();
}
public function operation():Void{
for(var i:Number=0; i < children.length; i++){
children[i].operation();
}
}
public function addComponent(aComponent:Component):Number{
return children.push(aComponent)-1;
}
public function removeComponent(aNumber:Number):Void{
children.splice(aNumber, 1);
}
public function getChild(aNumber:Number):Component{
return children[aNumber];
}
}
// usage
var aComponent:Composite = new Composite();
aComponent.addComponent(new Leaf(0));
var aComposite:Composite = new Composite();
aComposite.addComponent(aComponent);
aComposite.addComponent(new Leaf(1));
var leaf2 = aComposite.addComponent(new Leaf(2));
aComposite.addComponent(new Leaf(3));
aComposite.operation();
trace(”——————————–“);
aComposite.getChild(leaf2).operation();
trace(”——————————–“);
aComposite.removeComponent(leaf2);
aComposite.operation();
/* Output:
Leaf 0: operation
Leaf 1: operation
Leaf 2: operation
Leaf 3: operation
——————————–
Leaf 2: operation
——————————–
Leaf 0: operation
Leaf 1: operation
Leaf 3: operation
*/
