策略模式(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();