《PHP實(shí)例:學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)狀態(tài)模式》要點(diǎn):
本文介紹了PHP實(shí)例:學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)狀態(tài)模式,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
一、意圖
允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為.對(duì)象看起來(lái)似乎修改了它的類
狀態(tài)模式變化的位置在于對(duì)象的狀態(tài)
PHP學(xué)習(xí)
二、狀態(tài)模式結(jié)構(gòu)圖
PHP學(xué)習(xí)
PHP學(xué)習(xí)
三、狀態(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è)操作中含有龐大的多分支的條件語(yǔ)句,且這些分支依賴于該對(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學(xué)習(xí)
<?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學(xué)習(xí)
《PHP實(shí)例:學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)狀態(tài)模式》是否對(duì)您有啟發(fā),歡迎查看更多與《PHP實(shí)例:學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)狀態(tài)模式》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/8294.html