php設(shè)計(jì)模式 State (狀態(tài)模式)
更新時(shí)間:2011年06月26日 10:45:00 作者:
允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來(lái)似乎修改了它所屬的類(lèi)
狀態(tài)state模式是GOF23種模式中的一種,和命令模式一樣,也是一種行為模式。狀態(tài)模式和命令模式相當(dāng)像,一樣是“接口—實(shí)現(xiàn)類(lèi)”這種模式的應(yīng)用,是面向接口編程原則的體現(xiàn)。
狀態(tài)模式屬于對(duì)象創(chuàng)建型模式,其意圖是允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來(lái)似乎修改了他的類(lèi)。比較常見(jiàn)的例子是在一個(gè)表示網(wǎng)絡(luò)連接的類(lèi)TCPConnection,一個(gè)TCPConnection對(duì)象的狀態(tài)處于若干不同的狀態(tài)之一:連接已經(jīng)建立(Established),正在監(jiān)聽(tīng),連接已經(jīng)關(guān)閉(closed)。當(dāng)一個(gè)TCPConnection對(duì)象收到其他對(duì)象的請(qǐng)求時(shí),他根據(jù)自身的狀態(tài)作出不同的反應(yīng)。
例如:一個(gè)Open請(qǐng)求的結(jié)果依賴(lài)于該連接已關(guān)閉還是連接已建立狀態(tài)。State模式描述了TCPConnection如何在每一種狀態(tài)下表現(xiàn)出不同的行為。這一種模式的關(guān)鍵思想是引入了一個(gè)稱(chēng)為T(mén)CPState的抽象類(lèi)表示網(wǎng)絡(luò)的連接狀態(tài),TCPState類(lèi)為各種表示不同的操作狀態(tài)的字類(lèi)聲明了一個(gè)公共接口。TCPState的子類(lèi)實(shí)現(xiàn)與特定的狀態(tài)相關(guān)的行為。例如,TCPEstablished和TCPClosed類(lèi)分別實(shí)現(xiàn)了特定于TCPConnection的連接已建立狀態(tài)和連接已關(guān)閉狀態(tài)的行為。
舉例來(lái)說(shuō):一個(gè)人具有生氣,高興和抓狂等狀態(tài),在這些狀態(tài)下做同一個(gè)事情可能會(huì)有不同的結(jié)果,一個(gè)人的心情可能在這三種狀態(tài)中循環(huán)轉(zhuǎn)變。使用一個(gè)moodState類(lèi)表示一個(gè)人的心情,使用mad,Happy,Angry類(lèi)代表不同的心情。
先看一個(gè)例子:
<?php
/**
* 狀態(tài)模式
*
* 允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來(lái)似乎修改了它所屬的類(lèi)
*
*/
interface State
{
public function handle($state);
public function display();
}
class Context
{
private $_state = null;
public function __construct($state)
{
$this->setState($state);
}
public function setState($state)
{
$this->_state = $state;
}
public function request()
{
$this->_state->display();
$this->_state->handle($this);
}
}
class StateA implements State
{
public function handle($context)
{
$context->setState(new StateB());
}
public function display()
{
echo "state A<br/>";
}
}
class StateB implements State
{
public function handle($context)
{
$context->setState(new StateC());
}
public function display()
{
echo "state B<br/>";
}
}
class StateC implements State
{
public function handle($context)
{
$context->setState(new StateA());
}
public function display()
{
echo "state C<br/>";
}
}
// 實(shí)例化一下
$objContext = new Context(new StateB());
$objContext->request();
$objContext->request();
$objContext->request();
$objContext->request();
$objContext->request();
狀態(tài)模式的理解,關(guān)鍵有2點(diǎn):
1. 通常命令模式的接口中只有一個(gè)方法。 而狀態(tài)模式的接口中有1個(gè)或者多個(gè)方法。而且,狀態(tài)模式的實(shí)現(xiàn)類(lèi)的方法,一般返回值;或者是改變實(shí)例變量的值。也就是說(shuō),狀態(tài)模式一般和對(duì)象的狀態(tài)有關(guān)。實(shí)現(xiàn)類(lèi)的方法有不同的功能,覆蓋接口中的方法。狀態(tài)模式和命令模式一樣,也可以用于消除if…else等條件選擇語(yǔ)句。
2. 主要的用途是,作為實(shí)例變量,是一個(gè)對(duì)象引用。命令模式的主要的使用方式是參數(shù)回調(diào)模式。命令接口作為方法的參數(shù)傳遞進(jìn)來(lái)。然后,在方法體內(nèi)回調(diào)該接口。而狀態(tài)模式的主要使用方法,是作為實(shí)例變量,通過(guò)set屬性方法,或者構(gòu)造器把狀態(tài)接口的具體實(shí)現(xiàn)類(lèi)的實(shí)例傳遞進(jìn)來(lái)。因此,可以這樣比較命令模式和狀態(tài)模式的異同。
State模式和command模式都是十分常用,粒度比較小的模式,是很多更大型模式的一部分?;旧希瑂tate模式和command模式是十分相似的。只要開(kāi)發(fā)者心中對(duì)單例和多例有一個(gè)清醒的認(rèn)識(shí),即使不把它們分為兩種模式也沒(méi)事。
狀態(tài)模式屬于對(duì)象創(chuàng)建型模式,其意圖是允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來(lái)似乎修改了他的類(lèi)。比較常見(jiàn)的例子是在一個(gè)表示網(wǎng)絡(luò)連接的類(lèi)TCPConnection,一個(gè)TCPConnection對(duì)象的狀態(tài)處于若干不同的狀態(tài)之一:連接已經(jīng)建立(Established),正在監(jiān)聽(tīng),連接已經(jīng)關(guān)閉(closed)。當(dāng)一個(gè)TCPConnection對(duì)象收到其他對(duì)象的請(qǐng)求時(shí),他根據(jù)自身的狀態(tài)作出不同的反應(yīng)。
例如:一個(gè)Open請(qǐng)求的結(jié)果依賴(lài)于該連接已關(guān)閉還是連接已建立狀態(tài)。State模式描述了TCPConnection如何在每一種狀態(tài)下表現(xiàn)出不同的行為。這一種模式的關(guān)鍵思想是引入了一個(gè)稱(chēng)為T(mén)CPState的抽象類(lèi)表示網(wǎng)絡(luò)的連接狀態(tài),TCPState類(lèi)為各種表示不同的操作狀態(tài)的字類(lèi)聲明了一個(gè)公共接口。TCPState的子類(lèi)實(shí)現(xiàn)與特定的狀態(tài)相關(guān)的行為。例如,TCPEstablished和TCPClosed類(lèi)分別實(shí)現(xiàn)了特定于TCPConnection的連接已建立狀態(tài)和連接已關(guān)閉狀態(tài)的行為。
舉例來(lái)說(shuō):一個(gè)人具有生氣,高興和抓狂等狀態(tài),在這些狀態(tài)下做同一個(gè)事情可能會(huì)有不同的結(jié)果,一個(gè)人的心情可能在這三種狀態(tài)中循環(huán)轉(zhuǎn)變。使用一個(gè)moodState類(lèi)表示一個(gè)人的心情,使用mad,Happy,Angry類(lèi)代表不同的心情。
先看一個(gè)例子:
復(fù)制代碼 代碼如下:
<?php
/**
* 狀態(tài)模式
*
* 允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來(lái)似乎修改了它所屬的類(lèi)
*
*/
interface State
{
public function handle($state);
public function display();
}
class Context
{
private $_state = null;
public function __construct($state)
{
$this->setState($state);
}
public function setState($state)
{
$this->_state = $state;
}
public function request()
{
$this->_state->display();
$this->_state->handle($this);
}
}
class StateA implements State
{
public function handle($context)
{
$context->setState(new StateB());
}
public function display()
{
echo "state A<br/>";
}
}
class StateB implements State
{
public function handle($context)
{
$context->setState(new StateC());
}
public function display()
{
echo "state B<br/>";
}
}
class StateC implements State
{
public function handle($context)
{
$context->setState(new StateA());
}
public function display()
{
echo "state C<br/>";
}
}
// 實(shí)例化一下
$objContext = new Context(new StateB());
$objContext->request();
$objContext->request();
$objContext->request();
$objContext->request();
$objContext->request();
狀態(tài)模式的理解,關(guān)鍵有2點(diǎn):
1. 通常命令模式的接口中只有一個(gè)方法。 而狀態(tài)模式的接口中有1個(gè)或者多個(gè)方法。而且,狀態(tài)模式的實(shí)現(xiàn)類(lèi)的方法,一般返回值;或者是改變實(shí)例變量的值。也就是說(shuō),狀態(tài)模式一般和對(duì)象的狀態(tài)有關(guān)。實(shí)現(xiàn)類(lèi)的方法有不同的功能,覆蓋接口中的方法。狀態(tài)模式和命令模式一樣,也可以用于消除if…else等條件選擇語(yǔ)句。
2. 主要的用途是,作為實(shí)例變量,是一個(gè)對(duì)象引用。命令模式的主要的使用方式是參數(shù)回調(diào)模式。命令接口作為方法的參數(shù)傳遞進(jìn)來(lái)。然后,在方法體內(nèi)回調(diào)該接口。而狀態(tài)模式的主要使用方法,是作為實(shí)例變量,通過(guò)set屬性方法,或者構(gòu)造器把狀態(tài)接口的具體實(shí)現(xiàn)類(lèi)的實(shí)例傳遞進(jìn)來(lái)。因此,可以這樣比較命令模式和狀態(tài)模式的異同。
State模式和command模式都是十分常用,粒度比較小的模式,是很多更大型模式的一部分?;旧希瑂tate模式和command模式是十分相似的。只要開(kāi)發(fā)者心中對(duì)單例和多例有一個(gè)清醒的認(rèn)識(shí),即使不把它們分為兩種模式也沒(méi)事。
您可能感興趣的文章:
- PHP設(shè)計(jì)模式之狀態(tài)模式定義與用法詳解
- 學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)狀態(tài)模式
- php設(shè)計(jì)模式之狀態(tài)模式實(shí)例分析【星際爭(zhēng)霸游戲案例】
- PHP設(shè)計(jì)模式之觀察者模式(Observer)詳細(xì)介紹和代碼實(shí)例
- PHP常用的三種設(shè)計(jì)模式匯總
- PHP經(jīng)典面試題之設(shè)計(jì)模式(經(jīng)常遇到)
- php設(shè)計(jì)模式小結(jié)
- php 設(shè)計(jì)模式之 工廠(chǎng)模式
- php基礎(chǔ)設(shè)計(jì)模式大全(注冊(cè)樹(shù)模式、工廠(chǎng)模式、單列模式)
- PHP設(shè)計(jì)模式入門(mén)之狀態(tài)模式原理與實(shí)現(xiàn)方法分析
相關(guān)文章
PHP中strcmp()和strcasecmp()函數(shù)字符串比較用法分析
這篇文章主要介紹了PHP中strcmp()和strcasecmp()函數(shù)字符串比較用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了strcmp()和strcasecmp()函數(shù)字的功能,使用方法與區(qū)別,需要的朋友可以參考下2016-01-01PHP獲取當(dāng)前系統(tǒng)時(shí)間的方法小結(jié)
這篇文章主要介紹了PHP獲取當(dāng)前系統(tǒng)時(shí)間的方法小結(jié),需要的朋友可以參考下2018-10-10PHP實(shí)現(xiàn)清除wordpress里惡意代碼
這篇文章主要介紹了PHP實(shí)現(xiàn)清除wordpress里惡意代碼的方法以及相關(guān)代碼和使用方法,有需要的小伙伴可以參考下。2015-10-10PHP中利用substr_replace將指定兩位置之間的字符替換為*號(hào)
PHP的substr_replace將指定兩位置之間的字符替換為*號(hào)的代碼,需要的朋友可以參考下。2011-01-01對(duì)比PHP對(duì)MySQL的緩沖查詢(xún)和無(wú)緩沖查詢(xún)
PHP中使用函數(shù)查詢(xún)MySQL中的數(shù)據(jù)默認(rèn)是以緩沖模式,除此之外MySQL程序還支持一種無(wú)緩沖模式,本文我們將來(lái)對(duì)比PHP對(duì)MySQL的緩沖查詢(xún)和無(wú)緩沖查詢(xún):2016-07-07PHP實(shí)現(xiàn)統(tǒng)計(jì)在線(xiàn)人數(shù)功能示例
這篇文章主要介紹了PHP實(shí)現(xiàn)統(tǒng)計(jì)在線(xiàn)人數(shù)功能,結(jié)合實(shí)例形式分析了php基于session對(duì)象計(jì)算與統(tǒng)計(jì)在線(xiàn)人數(shù)的相關(guān)操作技巧,需要的朋友可以參考下2016-10-10