[toc]
## 舉個例子
> 水是世界上最奇特的物質之一,不僅滋潤萬物,更是變化萬千。
> 你很難想象冰、水、氣其實是同一個東西 H2O,
> 看到冰你可能更會聯想到玻璃、石頭,
> 看到水你可能更會聯想到牛奶、可樂,
> 看到氣可能更會聯想到空氣、氧氣。
> 三個不同狀態下的水好像是三種不同的東西。

## 代碼展示
```php
<?php
class Water {
private $temperature;
private $state;
public function __construct($state) {
$this->temperature = 25;
$this->state = $state;
}
public function setState($state) {
$this->state = $state;
}
public function changeState($state) {
if ($this->state) {
echo "由" . $this->state->getStateName() . "變為" . $state->getStateName() . ',';
} else {
echo "初始化為" . $state->getStateName() . ',';
}
$this->state = $state;
}
public function getTemperature() {
return $this->temperature;
}
public function setTemperature($temperature) {
$this->temperature = $temperature;
if ($this->temperature <= 0) {
$this->changeState(new SolidState("固態"));
} elseif ($this->temperature <= 100) {
$this->changeState(new LiquidState("液態"));
} else {
$this->changeState(new GaseousState("氣態"));
}
}
public function riseTemperature($step) {
$this->setTemperature($this->temperature + $step);
}
public function reduceTemperature($step) {
$this->setTemperature($this->temperature - $step);
}
public function behavior() {
$this->state->behavior($this);
}
}
class State {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function getStateName() {
return $this->name;
}
public function behavior($water) {
}
}
class SolidState extends State {
public function behavior($water) {
echo "我性格高冷,當前體溫" . $water->getTemperature() . "攝氏度,我堅如鋼鐵,仿如一冷血動物,請用我砸人,嘿嘿……" . PHP_EOL;
}
}
class LiquidState extends State {
public function behavior($water) {
echo "我性格溫和,當前體溫" . $water->getTemperature() . "攝氏度,我可滋潤萬物,飲用我可讓你活力倍增……" . PHP_EOL;
}
}
class GaseousState extends State {
public function behavior($water) {
echo "我性格熱烈,當前體溫" . $water->getTemperature(), "攝氏度,飛向天空是我畢生的夢想,在這你將看不到我的存在,我將達到無我的境界……" . PHP_EOL;
}
}
$water = new Water(new LiquidState("液態"));
$water->behavior();
$water->setTemperature(-4);
$water->behavior();
$water->riseTemperature(18);
$water->behavior();
$water->riseTemperature(110);
$water->behavior();
$water->setTemperature(60);
$water->behavior();
$water->reduceTemperature(80);
$water->behavior();
```
```
D:\soft\php72\php.exe D:\project\php_dp\index.php
我性格溫和,當前體溫25攝氏度,我可滋潤萬物,飲用我可讓你活力倍增……
由液態變為固態,我性格高冷,當前體溫-4攝氏度,我堅如鋼鐵,仿如一冷血動物,請用我砸人,嘿嘿……
由固態變為液態,我性格溫和,當前體溫14攝氏度,我可滋潤萬物,飲用我可讓你活力倍增……
由液態變為氣態,我性格熱烈,當前體溫124攝氏度,飛向天空是我畢生的夢想,在這你將看不到我的存在,我將達到無我的境界……
由氣態變為液態,我性格溫和,當前體溫60攝氏度,我可滋潤萬物,飲用我可讓你活力倍增……
由液態變為固態,我性格高冷,當前體溫-20攝氏度,我堅如鋼鐵,仿如一冷血動物,請用我砸人,嘿嘿……
Process finished with exit code 0
```
## 什么是狀態模式?
> 狀態即事物所處的某一種形態。
> 狀態模式是說一個對象在其內部狀態發生改變時,其表現的行為和外在屬性不一樣,這個對象看上去就像是改變了它的類型一樣。
> 狀態模式又稱為對象的行為模式。

## 應用場景
1. 一個對象的行為取決于它的狀態,并且它在運行時可能經常改變它的狀態從而改變它的行為。
1. 一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀態,且每一個分支的業務邏輯非常復雜時,我們可以使用狀態模式來拆分他不同分支邏輯,使程序有更好的可讀性可維護性。