PHP設(shè)計模式(十九)—狀態(tài)模式 (State Pattern)

狀態(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)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容