策略模式(Strategy Pattern)是对象的行为模式,是对一组算法的抽象封装,动态的选择算法使用。在我们的日常生活中,策略模式体现在方方面面:早上起床我去公司,可以坐公交,可以坐出租车,也可以步行,最终的目的都是到达公司,但是却使用了不同的资源。
策略模式的三个角色:
- 抽象策略角色
- 具体策略角色
- 环境角色(对抽象策略角色的引用)
- 定义抽象角色(类)或抽象方法(接口)(定义好各个实现的共同抽象方法)
- 定义具体策略类(实现父类的共同方法)
- 定义环境角色类(私有化声明抽象角色变量,重载构造方法,执行抽象方法)
<?php
/**
* 策略模式
* */
interface wayToSchool {
//定义抽象策略
public function way();
}
class wayWithCar implements wayToSchool {
//定义坐车去学校的具体策略
public function way() {
echo "goes to school by CAR!\n";
}
}
class wayWithBicycle implements wayToSchool {
//定义骑车去学校的具体策略
public function way() {
echo "goes to school by BICYCLE!\n";
}
}
class wayWithWalk implements wayToSchool {
//定义步行去学校的具体策略
public function way() {
echo "goes to school by WALK!\n";
}
}
class Student {
//定义环境角色类(学生)
private $_wayToSchool;
private $_name;
public function __construct($name) {
$this->_name = $name;
}
public function performance() {
echo $this->_name, " ";
$this->_wayToSchool->way();
}
public function setWayToSchool(wayToSchool $_way) {
$this->_wayToSchool = $_way;
}
}
$jerry = new Student("jerry");
$tom = new Student("tom");
$eggsy = new Student("eggsy");
//实现不同策略
$jerry->setWayToSchool(new wayWithCar);
$jerry->performance();
$tom->setWayToSchool(new wayWithBicycle);
$tom->performance();
$eggsy->setWayToSchool(new wayWithWalk);
$eggsy->performance();