狀態(tài)模式 (State Pattern) :允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為,讓不同狀態(tài)的對象看起來似乎修改了它的類,或者說是看起來不是來自同一個類。
(一)為什么需要狀態(tài)模式
1,將所有與某個狀態(tài)有關(guān)的行為放到一個類中,并且可以方便地增加新的狀態(tài),只需要改變對象狀態(tài)即可改變對象的行為。
2,本模式簡化了發(fā)起人類。發(fā)起人不再需要管理和保存其內(nèi)部狀態(tài)的一個個版本,客戶端可以自行管理他們所要的這些狀態(tài)的版本。
(二)狀態(tài)模式 UML圖
State Pattern
(三)簡單實例
狀態(tài)模式一個最妙的應(yīng)用就是通過變化狀態(tài)擁有不同的能力。比如我們以水為例,水如果是固態(tài),那么它就能融化成液態(tài),如果是液態(tài)那么它就能蒸發(fā)成氣態(tài),而氣態(tài)也能凝華成固態(tài)。現(xiàn)在就讓我們用程序來模擬這個過程。
<?php
//抽象狀態(tài)類
abstract class State{
abstract function handle();
}
//固態(tài)
class Solid extends State{
public function handle(){
echo '固態(tài) =>融化 =>液態(tài)轉(zhuǎn)化中'.PHP_EOL;
}
}
class Liquid extends State{
public function handle(){
echo '液態(tài) =>蒸發(fā) =>氣態(tài)轉(zhuǎn)化中'.PHP_EOL;
}
}
class Gas extends State{
public function handle(){
echo '氣態(tài) =>凝華 =>固態(tài)轉(zhuǎn)化中'.PHP_EOL;
}
}
//context環(huán)境類 -----water
class Water{
protected $states = array();
protected $current=0;
public function __construct()
{
$this->states[]=new Solid;
$this->states[]=new Liquid;
$this->states[]=new Gas;
}
//水的變化
public function change(){
//告知當(dāng)前狀態(tài)
echo '當(dāng)前所處狀態(tài)'.get_Class($this->states[$this->current]).PHP_EOL;
//當(dāng)前狀態(tài)能力
$this->states[$this->current]->handle();
//狀態(tài)變化
$this->changeState();
}
//狀態(tài)變化
public function changeState()
{
$this->current++ == 2 && $this->current = 0;
}
}
//實例化具體環(huán)境角色-----水
$water = new Water;
//水的能力變化 ---與它的狀態(tài)相關(guān)
$water->change();
$water->change();
$water->change();
$water->change();
當(dāng)然我們這里只是一個簡單的示例,你完全可以讓一個狀態(tài)有多個能力,或者通過給water給一個對外的接口,通過傳參使其轉(zhuǎn)化為你指定的狀態(tài)。