Bei einer Komposition (HAS-A-Beziehung von Container/Komponenten) mag es vorkommen, dass Komponente wie Container gleich behandelt werden sollen. Ein GUI-Element kann beispielsweise ein Container oder ein primitives Element wie ein Control sein. Beide Arten, Container wie Control haben aber viele gleiche Eigenschaften und Methoden, wie Draw(), Size(), Move(x,y), usw. Für eine flexible Verwendung leitet man Container und Komponente vom selben Interface ab. Sie verhalten sich damit nach außen gleich. Wenn nun z.B. Draw() auf dem Container aufgerufen wird, braucht dieser nur sich selbst zu zeichnen und danach auf seinen Komponenten Draw() aufzurufen, welche ihrerseits wieder beides sein können.
Hier ein Codeschnipsel in PHP:
<?php
interface IComponent
{
public function GetSize();
public function GetWeight();
}
class Component implements IComponent
{
private $width;
private $height;
private $length;
private $weight;
public function __construct($width, $height, $length, $weight)
{
$this->width = $width;
$this->height = $height;
$this->length = $length;
$this->weight = $weight;
}
public function GetSize()
{
return $this->width * $this->height * $this->length;
}
public function GetWeight()
{
return $this->weight;
}
}
class Container extends Component implements IComponent
{
private $components = array();
public function __construct($width, $height, $length, $weight)
{
parent::__construct($width, $height, $length, $weight);
}
public function Add ($component)
{
$this->components[] = $component;
}
public function GetSize()
{
return parent::GetSize();
}
public function GetWeight()
{
$weight = parent::GetWeight();
foreach ($this->components as $info => $value )
$weight += $value->GetWeight();
return $weight;
}
}
$container1 = new Container(10,10,10,1000);
$component2 = new Component(2,2,2,200);
$container = new Container(100, 100, 100, 100000);
$container->Add($container1);
$container->Add($component2);
$minicontainer = new Container (8,8,8,8);
$minicomponent = new Component (2,2,2,2);
$minicomponent2 = new Component (2,2,2,2);
$minicontainer->Add($minicomponent);
$minicontainer->Add($minicomponent2);
$container1->Add($minicontainer);
echo "Total Weight: <br\>";
echo $container->GetWeight();
?>
Mein Beispiel stellt eine Schiffscontainerstruktur dar. Container wie Component sind beide vom Typ IComponent und bieten die Methoden GetSize() und GetWeight() an. Statt bei der Gewichtsberechnung den Typ zu unterscheiden brauche ich nur GetWeight() aufzurufen.
