溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在php中應(yīng)用狀態(tài)模式

發(fā)布時(shí)間:2021-06-07 17:42:27 來(lái)源:億速云 閱讀:131 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)怎么在php中應(yīng)用狀態(tài)模式,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

待解決的問(wèn)題:封裝坦克的狀態(tài),讓狀態(tài)自己去控制行為。

思路:把狀態(tài)作為屬性,兵種類本身只控制狀態(tài)的變化,具體的行為由狀態(tài)類定義。

狀態(tài)(State)模式示例:

<?php
  //坦克狀態(tài)的接口
  interface TankState
  {
    //坦克的攻擊方法
    public function attack();
  }

  //坦克普通狀態(tài)
  class TankState_Tank implements TankState
  {
    //坦克的攻擊方法
    public function attack()
    {
      //這里簡(jiǎn)單的輸出當(dāng)前狀態(tài)
      echo "普通狀態(tài)";
    }
  }

  //坦克架起來(lái)的狀態(tài)
  class TankState_Siege implements TankState
  {
    //坦克的攻擊方法
    public function attack()
    {
      //這里簡(jiǎn)單的輸出當(dāng)前狀態(tài)
      echo "架起來(lái)了";
    }
  }

  //坦克類
  class Tank
  {
    //狀態(tài)
    public $state;

    //坦克的攻擊方法
    public function __construct()
    {
      //新造出來(lái)的坦克當(dāng)然是普通狀態(tài)
      $this->state = new TankState_Tank();
    }

    //設(shè)置狀態(tài)的方法,假設(shè)參數(shù)為玩家點(diǎn)擊的鍵盤
    public function setState($key)
    {
      //如果按了s
      if($key = 's')
      {
        $this->state = new TankState_Siege();
      }
      //如果按了t
      elseif($key = 't')
      {
        $this->state = new TankState_Tank();
      }
    }

    //坦克的攻擊方法
    public function attack()
    {
      //由當(dāng)前狀態(tài)自己來(lái)處理攻擊
      $this->state->attack();
    }
  }

  //新造一輛坦克
  $tank = new Tank();

  //假設(shè)正好有個(gè)敵人路過(guò),坦克就以普通模式攻擊了
  $tank->attack();

  //架起坦克
  $tank->setState('s');

  //坦克再次攻擊,這次是架起模式
  $tank->attack();
?>

用途總結(jié):狀態(tài)模式可以將和狀態(tài)相關(guān)的行為和屬性封裝,除了切換狀態(tài)時(shí),其它地方就不需要大量的判斷當(dāng)前狀態(tài),只要調(diào)用當(dāng)前狀態(tài)的方法等。

實(shí)現(xiàn)總結(jié):用一個(gè)接口規(guī)范狀態(tài)類需要實(shí)現(xiàn)的方法,比如上面的TankState規(guī)定了attack()。把各個(gè)狀態(tài)封裝成類,將不同狀態(tài)下的不同方法放入各自的狀態(tài)類,比如上面的攻擊方法,同時(shí)所有的狀態(tài)執(zhí)行接口。原來(lái)的事務(wù)類,比如上面的Tank類,只負(fù)責(zé)狀態(tài)切換,一旦需要某一個(gè)方法的調(diào)用,只要交給當(dāng)前狀態(tài)就可以了。

關(guān)于怎么在php中應(yīng)用狀態(tài)模式就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI