abstract class Product {
private $count;
private $costStrategy;
function __construct( $count, CostStrategy $strategy ) {
$this->count = $count;
$this->costStrategy = $strategy;
}
function cost() {
return $this->costStrategy->cost( $this );
}
function chargeType() {
return $this->costStrategy->chargeType( );
}
function getDuration() {
return $this->count;
}
}
class ProductOne extends Product {
}
class ProductTwo extends Product {
}
abstract class CostStrategy {
abstract function cost( Product $lesson );
abstract function chargeType();
}
class TimedCostStrategy extends CostStrategy {
function cost( Product $lesson ) {
return ( $lesson->getDuration() * 5 );
}
function chargeType() {
return "hourly rate";
}
}
class FixedCostStrategy extends CostStrategy {
function cost( Product $lesson ) {
return 30;
}
function chargeType() {
return "fixed rate";
}
}
$lessons[] = new ProductTwo( 4, new TimedCostStrategy() );
$lessons[] = new ProductOne( 4, new FixedCostStrategy() );
foreach ( $lessons as $lesson ) {
print "lesson charge {$lesson->cost()}. ";
print "Charge type: {$lesson->chargeType()}\n";
}
?>