1 <?php
2 abstract class Lesson{
3 protected $duration;
4 const FIXED = 1;
5 const TIMED = 2;
6 private $costtype;
7
8 function __construct($duration,$costtype){
9 $this->duration = $duration;
10 $this->costtype = $costtype;
11 }
12
13 function cost(){
14 switch ($this->costtype){
15 case self::TIMED :
16 return (5*$this->duration);
17 break;
18 case self::FIXED:
19 return 30;
20 break;
21 default :
22 $this->costtype = self::FIXED;
23 return 30;
24 }
25 }
26
27 function chargeType()
28 {
29 switch ($this->costtype)
30 {
31 case self::TIMED:
32 return "hourly rate";
33 break;
34 case self::FIXED:
35 return "fixed rate";
36 break;
37 default :
38 $this->costtype = self::FIXED;
39 return "fixed rate";
40 }
41 }
42
43 //Lesson的更多方法
44 }
45
46 class Lecture extends Lesson{
47 //Lecture特定的实现
48 }
49
50 class Seminar extends Lesson{
51 //Seminar特定的实现
52 }
53
54 //下面如何使用这些类
55 $lecture = new Lecture(5,Lesson::FIXED);
56 print "{$lecture->cost()},{$lecture->chargeType()} \n";//30,fixed rate
57
58 $seminar = new Seminar(3,Lesson::TIMED);
59 print "{$seminar->cost()},{$seminar->chargeType()} \n";//15,hourly rate
使用组合:使用策略模式(strategy)来解决条件语句
<?php
abstract class Lesson{
private $duration;private $costStrategy;
function __construct($duration,CostStrategy $strategy)
{
$this->duration = $duration;
$this->costStrategy = $strategy;
}function cost()
{
return $this->costStrategy->cost($this);//“委托”另外的类中的方法去执行
}function chargeType()
{
return $this->costStrategy->chargeType();//“委托”另外的类中的方法去执行
}function getDuration()
{
return $this->duration;
}//Lesson的更多方法
}class Lecture extends Lesson{
//Lecture 特定的实现
}class Seminar extends Lesson{
//Seminar 特定的实现
}abstract class CostStrategy{
abstract function cost(Lesson $lesson);abstract function chargeType();
}class TimedCostStrategy extends CostStrategy{
function cost(Lesson $lesson)
{
return ($lesson->getDuration()*5);
}function chargeType()
{
return "hourly rate";
}
}class FixedCostStrategy extends CostStrategy{
function cost(Lesson $lesson)
{
return 30;
}function chargeType()
{
return "fixed rate";
}
}$lessons[] = new lecture(4,new TimedCostStrategy());
$lessons[] = new Seminar(4,new FixedCostStrategy());foreach ($lessons as $lesson)
{
print "lesson charge: {$lesson->cost()} ";
print "charge type: {$lesson->chargeType()} \n";
}//lesson charge: 20 charge type: hourly rate
//lesson charge: 30 charge type: fixed rate
细学设计模式一(组合与继承)