一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - php設(shè)計(jì)模式 State (狀態(tài)模式)

php設(shè)計(jì)模式 State (狀態(tài)模式)

2019-12-01 12:40PHP教程網(wǎng) PHP教程

允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來似乎修改了它所屬的類

狀態(tài)state模式是GOF23種模式中的一種,和命令模式一樣,也是一種行為模式。狀態(tài)模式和命令模式相當(dāng)像,一樣是“接口—實(shí)現(xiàn)類”這種模式的應(yīng)用,是面向接口編程原則的體現(xiàn)。 

狀態(tài)模式屬于對(duì)象創(chuàng)建型模式,其意圖是允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來似乎修改了他的類。比較常見的例子是在一個(gè)表示網(wǎng)絡(luò)連接的類TCPConnection,一個(gè)TCPConnection對(duì)象的狀態(tài)處于若干不同的狀態(tài)之一:連接已經(jīng)建立(Established),正在監(jiān)聽,連接已經(jīng)關(guān)閉(closed)。當(dāng)一個(gè)TCPConnection對(duì)象收到其他對(duì)象的請(qǐng)求時(shí),他根據(jù)自身的狀態(tài)作出不同的反應(yīng)。 

例如:一個(gè)Open請(qǐng)求的結(jié)果依賴于該連接已關(guān)閉還是連接已建立狀態(tài)。State模式描述了TCPConnection如何在每一種狀態(tài)下表現(xiàn)出不同的行為。這一種模式的關(guān)鍵思想是引入了一個(gè)稱為TCPState的抽象類表示網(wǎng)絡(luò)的連接狀態(tài),TCPState類為各種表示不同的操作狀態(tài)的字類聲明了一個(gè)公共接口。TCPState的子類實(shí)現(xiàn)與特定的狀態(tài)相關(guān)的行為。例如,TCPEstablished和TCPClosed類分別實(shí)現(xiàn)了特定于TCPConnection的連接已建立狀態(tài)和連接已關(guān)閉狀態(tài)的行為。 

舉例來說:一個(gè)人具有生氣,高興和抓狂等狀態(tài),在這些狀態(tài)下做同一個(gè)事情可能會(huì)有不同的結(jié)果,一個(gè)人的心情可能在這三種狀態(tài)中循環(huán)轉(zhuǎn)變。使用一個(gè)moodState類表示一個(gè)人的心情,使用mad,Happy,Angry類代表不同的心情。 

先看一個(gè)例子: 

復(fù)制代碼代碼如下:


<?php 
/** 
* 狀態(tài)模式 

* 允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來似乎修改了它所屬的類 

*/ 
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)類的方法,一般返回值;或者是改變實(shí)例變量的值。也就是說,狀態(tài)模式一般和對(duì)象的狀態(tài)有關(guān)。實(shí)現(xiàn)類的方法有不同的功能,覆蓋接口中的方法。狀態(tài)模式和命令模式一樣,也可以用于消除if…else等條件選擇語句。 

2. 主要的用途是,作為實(shí)例變量,是一個(gè)對(duì)象引用。命令模式的主要的使用方式是參數(shù)回調(diào)模式。命令接口作為方法的參數(shù)傳遞進(jìn)來。然后,在方法體內(nèi)回調(diào)該接口。而狀態(tài)模式的主要使用方法,是作為實(shí)例變量,通過set屬性方法,或者構(gòu)造器把狀態(tài)接口的具體實(shí)現(xiàn)類的實(shí)例傳遞進(jìn)來。因此,可以這樣比較命令模式和狀態(tài)模式的異同。 

State模式和command模式都是十分常用,粒度比較小的模式,是很多更大型模式的一部分。基本上,state模式和command模式是十分相似的。只要開發(fā)者心中對(duì)單例和多例有一個(gè)清醒的認(rèn)識(shí),即使不把它們分為兩種模式也沒事。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天堂一区二区在线观看 | 日韩黄色录像 | 亚洲欧美久久久久久久久久爽网站 | 久久精品国产亚洲AV天美18 | 亚洲黄色天堂 | 国产成人免费观看在线视频 | 26uuu成人人网图片 | 亚洲精品国产在线网站 | 国产第一福利 | jazz欧美人免费xxxxxx | 草莓视频丝瓜 | 午夜影院小视频 | 亚洲欧美日韩国产一区图片 | 大象传媒1234区 | 美女张开腿让男人桶的 视频 | 免费看男女污污完整版 | 色综合国产 | 美女福利视频一区二区 | 四虎国产精品免费久久麻豆 | 亚洲小视频 | 国产自拍视频网站 | 撕开老师的丝袜白丝扒开粉嫩的小 | 日韩一级在线观看 | 人体做爰aaaa免费 | 欧美一区二区三区在线观看不卡 | 国产精品视频人人做人人爱 | 国产精品51麻豆cm传媒 | 男女激情视频1000辣妞范 | a级毛片毛片免费观看永久 a级黄色片免费 | 国产精品毛片va一区二区三区 | 国产精品一区二区不卡的视频 | 91麻豆国产福利精品 | 国内老司机精品视频在线播出 | 欧美成人精品福利网站 | 久久国产36精品色熟妇 | 午夜在线观看免费完整直播网 | 99久久国产综合精品女不卡 | 男同gay作爰视频网站 | 2021小妲己永久回家地址 | 日韩永久在线观看免费视频 | 日韩成人在线影院 |