php 状态模式,PHP设计模式(十九)—状态模式 (State Pattern)
狀態模式 (State Pattern) :允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。其別名為狀態對象(Objects for States)
(一)為什么需要狀態模式
1,將所有與某個狀態有關的行為放到一個類中,并且可以方便地增加新的狀態,只需要改變對象狀態即可改變對象的行為。
2,本模式簡化了發起人類。發起人不再需要管理和保存其內部狀態的一個個版本,客戶端可以自行管理他們所要的這些狀態的版本。
(二)狀態模式 UML圖
(三)簡單實例
狀態模式一個最妙的應用就是通過變化狀態擁有不同的能力。比如我們以水為例,水如果是固態,那么它就能融化成液態,如果是液態那么它就能蒸發成氣態,而氣態也能凝華成固態。現在就讓我們用程序來模擬這個過程。
//抽象狀態類
abstract class State{
abstract function handle();
}
//固態
class Solid extends State{
public function handle(){
echo '固態 =>融化 =>液態轉化中'.PHP_EOL;
}
}
class Liquid extends State{
public function handle(){
echo '液態 =>蒸發 =>氣態轉化中'.PHP_EOL;
}
}
class Gas extends State{
public function handle(){
echo '氣態 =>凝華 =>固態轉化中'.PHP_EOL;
}
}
//context環境類 -----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(){
//告知當前狀態
echo '當前所處狀態'.get_Class($this->states[$this->current]).PHP_EOL;
//當前狀態能力
$this->states[$this->current]->handle();
//狀態變化
$this->changeState();
}
//狀態變化
public function changeState()
{
$this->current++ == 2 && $this->current = 0;
}
}
//實例化具體環境角色-----水
$water = new Water;
//水的能力變化 ---與它的狀態相關
$water->change();
$water->change();
$water->change();
$water->change();
當然我們這里只是一個簡單的示例,你完全可以讓一個狀態有多個能力,或者通過給water給一個對外的接口,通過傳參使其轉化為你指定的狀態。
總結
以上是生活随笔為你收集整理的php 状态模式,PHP设计模式(十九)—状态模式 (State Pattern)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql增量备份二进制日志,mysql
- 下一篇: php批量修改标题,帝国CMS批量修改信