Composite Pattern

<?php

abstract class Horse{
abstract function get_horsepower();
}

class Pony extends Horse{
public function get_horsepower(){
return 0.7;
}
}

class RidingHorse extends Horse{
public function get_horsepower(){
return 1.0;
}
}

class WarHorse extends Horse{
public function get_horsepower(){
return 1.5;
}
}

/* ~~~~~~~~~~~~~ Wagons ~~~~~~~~~~~~~ */

class SmallWagon{
private $_horses = array();
public function add_horse(Horse $new_horse){
array_push($this->_horses,$new_horse);
}
public function get_horsepower(){
$total_horsepower = 0;
foreach($this->_horses as $horse){
$total_horsepower += $horse->get_horsepower();
}
return $total_horsepower - ($total_horsepower * 0.1); //10% Decrease
}
}

class LargeWagon{
private $_horses = array();
public function add_horse(Horse $new_horse){
array_push($this->_horses,$new_horse);
}
public function get_horsepower(){
$total_horsepower = 0;
foreach($this->_horses as $horse){
$total_horsepower += $horse->get_horsepower();
}
return $total_horsepower - ($total_horsepower * 0.2); //20% Decrease
}
}
echo '~~~~~~~~~~~~~ Composite Example: ~~~~~~~~~~~~~';

$wagon = new SmallWagon();
$wagon->add_horse(new WarHorse());
$wagon->add_horse(new WarHorse());
$wagon->add_horse(new Pony());

$lg_wagon = new LargeWagon();
$lg_wagon->add_horse(new WarHorse());
$lg_wagon->add_horse(new WarHorse());
$lg_wagon->add_horse(new Pony());

echo '<pre>';
print_r($wagon);
echo 'Small Wagon HP: ';
print_r($wagon->get_horsepower());
echo '<br>Large Wagon HP: ';
print_r($lg_wagon->get_horsepower());
echo '</pre><br><br>';

?>

0 Comments

You must be logged in to post a comment.