Design Patterns Php

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";
}
?>