學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)狀態(tài)模式
一、意圖
允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。對(duì)象看起來似乎修改了它的類
狀態(tài)模式變化的位置在于對(duì)象的狀態(tài)
二、狀態(tài)模式結(jié)構(gòu)圖
三、狀態(tài)模式中主要角色
抽象狀態(tài)(State)角色:定義一個(gè)接口,用以封裝環(huán)境對(duì)象的一個(gè)特定的狀態(tài)所對(duì)應(yīng)的行為
具體狀態(tài)(ConcreteState)角色:每一個(gè)具體狀態(tài)類都實(shí)現(xiàn)了環(huán)境(Context)的一個(gè)狀態(tài)所對(duì)應(yīng)的行為
環(huán)境(Context)角色:定義客戶端所感興趣的接口,并且保留一個(gè)具體狀態(tài)類的實(shí)例。這個(gè)具體狀態(tài)類的實(shí)例給出此環(huán)境對(duì)象的現(xiàn)有狀態(tài)
四、狀態(tài)模式的優(yōu)點(diǎn)和缺點(diǎn)
1、它將與特定狀態(tài)相關(guān)的行為局部化
2、它使得狀態(tài)轉(zhuǎn)換顯示化
3、State對(duì)象可被共享
五、狀態(tài)模式適用場(chǎng)景
1、一個(gè)對(duì)象的行為取決于它的狀態(tài),并且它必須在運(yùn)行時(shí)刻根據(jù)狀態(tài)改變它的行為
2、一個(gè)操作中含有龐大的多分支的條件語句,且這些分支依賴于該對(duì)象的狀態(tài)。這個(gè)狀態(tài)通常用一個(gè)或多個(gè)枚舉常量表示。通常,有多個(gè)操作包含這一相同的條件結(jié)構(gòu)。State模式模式將每一個(gè)條件分支放入一個(gè)獨(dú)立的類中。這使得你可以要所對(duì)象自身的情況將對(duì)象的狀態(tài)作為一個(gè)對(duì)象,這一對(duì)象可以不依賴于其他對(duì)象而獨(dú)立變化
六、狀態(tài)模式與其它模式
單例模式(singleton模式):具體狀態(tài)對(duì)象通常是單例模式
享元模式(flyweight模式):享元模式解釋了何時(shí)以及怎樣共享狀態(tài)對(duì)象
七、狀態(tài)模式PHP示例
<?php /** * 抽象狀態(tài)角色 */ interface State { /** * 方法示例 */ public function handle(Context $context); } /** * 具體狀態(tài)角色A * 單例類 */ class ConcreteStateA implements State { /* 唯一的實(shí)例 */ private static $_instance = null; private function __construct() { } /** * 靜態(tài)工廠方法,返還此類的唯一實(shí)例 */ public static function getInstance() { if (is_null(self::$_instance)) { self::$_instance = new ConcreteStateA(); } return self::$_instance; } public function handle(Context $context) { echo 'Concrete Sate A handle method<br />'; $context->setState(ConcreteStateB::getInstance()); } } /** * 具體狀態(tài)角色B * 單例類 */ class ConcreteStateB implements State { /* 唯一的實(shí)例 */ private static $_instance = null; private function __construct() { } /** * 靜態(tài)工廠方法,返還此類的唯一實(shí)例 */ public static function getInstance() { if (is_null(self::$_instance)) { self::$_instance = new ConcreteStateB(); } return self::$_instance; } public function handle(Context $context) { echo 'Concrete Sate B handle method<br />'; $context->setState(ConcreteStateA::getInstance()); } } /** * 環(huán)境角色 */ class Context { private $_state; /** * 默認(rèn)為StateA */ public function __construct() { $this->_state = ConcreteStateA::getInstance(); } public function setState(State $state) { $this->_state = $state; } public function request() { $this->_state->handle($this); } } /** * 客戶端 */ class Client { /** * Main program. */ public static function main() { $context = new Context(); $context->request(); $context->request(); $context->request(); $context->request(); } } Client::main(); ?>
以上就是使用php實(shí)現(xiàn)狀態(tài)模式的代碼,還有一些關(guān)于狀態(tài)模式的概念區(qū)分,希望對(duì)大家的學(xué)習(xí)有所幫助。
- php設(shè)計(jì)模式 State (狀態(tài)模式)
- PHP設(shè)計(jì)模式之狀態(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ì)模式之 工廠模式
- php基礎(chǔ)設(shè)計(jì)模式大全(注冊(cè)樹模式、工廠模式、單列模式)
- PHP設(shè)計(jì)模式入門之狀態(tài)模式原理與實(shí)現(xiàn)方法分析
相關(guān)文章
調(diào)試一段PHP程序時(shí)遇到的三個(gè)問題
調(diào)試一段PHP程序時(shí)遇到的三個(gè)問題,學(xué)習(xí)php的朋友可以參考下。2012-01-01PHP使用CURL實(shí)現(xiàn)多線程抓取網(wǎng)頁
PHP 利用 Curl 可以完成各種傳送文件操作,比如模擬瀏覽器發(fā)送GET,POST請(qǐng)求等等,然而因?yàn)閜hp語言本身不支持多線程,所以開發(fā)爬蟲程序效率并不高,不過可以用 Curl ,借助Curl 這個(gè)功能實(shí)現(xiàn)并發(fā)多線程的訪問多個(gè)url地址以實(shí)現(xiàn)并發(fā)多線程抓取網(wǎng)頁或者下載文件2015-04-04php連接函數(shù)implode與分割explode的深入解析
本篇文章是對(duì)php連接函數(shù)implode與分割explode進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP 多維數(shù)組的排序問題 根據(jù)二維數(shù)組中某個(gè)項(xiàng)排序
PHP 多維數(shù)組排序 根據(jù)二維數(shù)組中某個(gè)項(xiàng)排序,需要的朋友可以參考下。2011-11-11