日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

PHP設(shè)計模式入門之狀態(tài)模式原理與實現(xiàn)方法分析

瀏覽:241日期:2022-09-10 16:15:01

本文實例講述了PHP設(shè)計模式入門之狀態(tài)模式原理與實現(xiàn)方法。分享給大家供大家參考,具體如下:

想必大家都用過自動售賣的自動飲料機吧,塞入硬幣或紙幣,選擇想要的飲料,飲料就會在機器的下方滾出。大家有沒有相關(guān)如果用程序去寫一個飲料機要怎么樣實現(xiàn)呢?

首先我們可以分享一下這部飲料機有幾種狀態(tài)

一、沒有錢的狀態(tài)

二、有錢的狀態(tài)

三、售出的狀態(tài)

四、銷售一空的狀態(tài)

好吧,知道了這些狀態(tài)之后我們開始寫代碼了!

JuiceMachine.php

<?php/** * 飲料機 * @author ben * */class JuiceMachine{ /** * 糖果機一共存在四種狀態(tài):沒錢,有錢,成功售出以及銷售一空 * * 沒錢的狀態(tài) * @var INT */ const NOMONEY = 0; /** * 有錢的狀態(tài) * @var INT */ const HASMONEY = 1; /** * 成功售出的狀態(tài) * @var INT */ const SOLD = 2; /** * 銷售一空的狀態(tài) * @var INT */ const SOLDOUT = 3; /** * 記錄糖果機當(dāng)前的狀態(tài),初始化狀態(tài)為售空 * @var INT */ private $_state = JuiceMachine::SOLDOUT; /** * 該變量用于記錄飲料機中飲料的數(shù)量 */ private $_count; /** * 構(gòu)造方法,最主要是用來初始化count和state屬性的 */ public function __construct($count){ $this->_count = $count; //當(dāng)飲料機中的飲料數(shù)量大于零時,將飲料機的狀態(tài)重置為沒有錢的狀態(tài)。 if($this->_count > 0){ $this->_state = JuiceMachine::NOMONEY; } } /** * 投入硬幣 */ public function insertCoin(){ if($this->_state == JuiceMachine::HASMONEY ){ echo 'you can’t insert another coin!<br />'; }elseif($this->_state == JuiceMachine::NOMONEY){ echo 'you just insert a coin<br />'; $this->_state = JuiceMachine::HASMONEY; }elseif($this->_state == JuiceMachine::SOLD){ echo 'wait a minute, we are giving you a bottle of juice<br />'; }elseif($this->_state == JuiceMachine::SOLDOUT){ echo 'you can’t insert coin, the machine is already soldout<br />'; } } /** * 退回硬幣 */ public function retreatCoin(){ if($this->_state == JuiceMachine::HASMONEY ){ echo 'coin return!<br />'; $this->_state = JuiceMachine::NOMONEY; }elseif($this->_state == JuiceMachine::NOMONEY){ echo 'you have’nt inserted a coin yet<br />'; }elseif($this->_state == JuiceMachine::SOLD){ echo 'sorry, you already clicked the botton<br />'; }elseif($this->_state == JuiceMachine::SOLDOUT){ echo 'you have’nt inserted a coin yet<br />'; } } /** * 點擊飲料對應(yīng)的按鈕 */ public function clickButton(){ if($this->_state == JuiceMachine::HASMONEY ){ echo 'you clicked, we are giving you a bottle of juice...<br />'; $this->_state = JuiceMachine::SOLD; //改變飲料機的狀態(tài)為售出模式 $this->dispend(); }elseif($this->_state == JuiceMachine::NOMONEY){ echo 'you clicked,but you hav’nt inserted a coin yet<br />'; }elseif($this->_state == JuiceMachine::SOLD){ echo 'click twice does’nt get you two bottle of juice<br />'; }elseif($this->_state == JuiceMachine::SOLDOUT){ echo 'you clicked, but the machine is already soldout<br />'; } } /** * 發(fā)放飲料 */ public function dispend(){ if($this->_state == JuiceMachine::HASMONEY ){ echo 'please click the button first<br />'; }elseif($this->_state == JuiceMachine::NOMONEY){ echo 'you need to pay first<br />'; }elseif($this->_state == JuiceMachine::SOLD){ echo 'now you get you juice<br />'; //飲料機中的飲料數(shù)量減一 $this->_count--; if($this->_count <= 0){ echo 'opps, runing out of juice<br />'; //如果這時飲料機中沒有飲料了,將飲料機的狀態(tài)重置為銷售一空 $this->_state = JuiceMachine::SOLDOUT; }else{ //將飲料機的狀態(tài)重置為沒有錢 $this->_state = JuiceMachine::NOMONEY; } }elseif($this->_state == JuiceMachine::SOLDOUT){ //其實這種情況不應(yīng)該出現(xiàn) echo 'opps, it appears that we don’t have any juice left<br />'; } }}

index.php

<?phprequire_once ’JuiceMachine.php’; $juiceMachine = new JuiceMachine(1); $juiceMachine->insertCoin();$juiceMachine->clickButton();

運行的結(jié)果是:

you just insert a coinyou clicked, we are giving you a bottle of juice...now you get you juiceopps, runing out of juice

到目前為止我們的程序運行良好,沒有出現(xiàn)什么問題,但是從這些多重的if判斷中你是否嗅到了壞代碼的味道呢?有一天問題終于出現(xiàn)了,老板希望當(dāng)用戶點擊按鈕時有10%的概率拿到兩瓶飲料,我們需要為飲料機多加一個狀態(tài),這時去修改代碼就成為了一種災(zāi)難,而且很可能會影響到之前的代碼,帶來新的bug,看看狀態(tài)模式如何幫助我們度過難關(guān)吧!

狀態(tài)模式的官方定義是:狀態(tài)模式允許對象在內(nèi)部狀態(tài)改變是改變它的行為,對象看起來好像是修改了它的類

用uml類圖表示如下:

PHP設(shè)計模式入門之狀態(tài)模式原理與實現(xiàn)方法分析

在我們這個項目中的實際類圖如下:

PHP設(shè)計模式入門之狀態(tài)模式原理與實現(xiàn)方法分析

具體實現(xiàn)代碼:

State.php

<?phpinterface State{ /** * 插入硬幣 */ public function insertCoin(); /** * 回退硬幣 */ public function retreatCoin(); /** * 點擊按鈕 */ public function clickButton(); /** * 發(fā)放飲料 */ public function dispend();}

NomoneyState.php

<?phprequire_once ’State.php’;class NomoneyState implements State{ /** * 飲料機的實例 * * @var object */ private $_juiceMachine; /** * 構(gòu)造方法,主要用于初始化飲料機實例 * */ public function __construct($juiceMachine){ $this->_juiceMachine = $juiceMachine; } /* (non-PHPdoc) * @see State::insertCoin() */ public function insertCoin() { // TODO Auto-generated method stub echo 'you just insert a coin<br />'; //將飲料機的狀態(tài)切換成有錢的狀態(tài) $this->_juiceMachine->setState($this->_juiceMachine->getHasmoneyState()); } /* (non-PHPdoc) * @see State::retreatCoin() */ public function retreatCoin() { // TODO Auto-generated method stub echo 'you have’nt inserted a coin yet<br />'; } /* (non-PHPdoc) * @see State::clickButton() */ public function clickButton() { // TODO Auto-generated method stub echo 'you clicked,but you hav’nt inserted a coin yet<br />'; } /* (non-PHPdoc) * @see State::dispend() */ public function dispend() { // TODO Auto-generated method stub echo 'you need to pay first<br />'; }}

HasmoneyState.php

<?phprequire_once ’State.php’; class HasmoneyState implements State{ /** * 飲料機的實例 * * @var object */ private $_juiceMachine; /** * 構(gòu)造方法,主要用于初始化飲料機實例 */ public function __construct($juiceMachine) { $this->_juiceMachine = $juiceMachine; } /* * (non-PHPdoc) @see State::insertCoin() */ public function insertCoin() { // TODO Auto-generated method stub echo 'you can’t insert another coin!<br />'; } /* * (non-PHPdoc) @see State::retreatCoin() */ public function retreatCoin() { // TODO Auto-generated method stub echo 'coin return!<br />'; $this->_juiceMachine->setState($this->_juiceMachine->getNomoneyState()); } /* * (non-PHPdoc) @see State::clickButton() */ public function clickButton() { // TODO Auto-generated method stub echo 'you clicked, we are giving you a bottle of juice...<br />'; // 改變飲料機的狀態(tài)為售出模式 $rand = mt_rand(0, 0); // 當(dāng)隨機數(shù)為0(即1/10的概率)并且飲料機中還有1瓶以上的飲料時 if ($rand == 0 && $this->_juiceMachine->getCount() > 1) { $this->_juiceMachine->setState($this->_juiceMachine->getWinnerState()); } else { $this->_juiceMachine->setState($this->_juiceMachine->getSoldState()); } } /* * (non-PHPdoc) @see State::dispend() */ public function dispend() { // TODO Auto-generated method stub echo 'please click the button first<br />'; }}

SoldoutState.php

<?phprequire_once ’State.php’;class SoldoutState implements State{ /** * 飲料機的實例 * * @var object */ private $_juiceMachine; /** * 構(gòu)造方法,主要用于初始化飲料機實例 * */ public function __construct($juiceMachine){ $this->_juiceMachine = $juiceMachine; } /* (non-PHPdoc) * @see State::insertCoin() */ public function insertCoin() { // TODO Auto-generated method stub echo 'you can’t insert coin, the machine is already soldout<br />'; } /* (non-PHPdoc) * @see State::retreatCoin() */ public function retreatCoin() { // TODO Auto-generated method stub echo 'you have’nt inserted a coin yet<br />'; } /* (non-PHPdoc) * @see State::clickButton() */ public function clickButton() { // TODO Auto-generated method stub echo 'you clicked, but the machine is already soldout<br />'; } /* (non-PHPdoc) * @see State::dispend() */ public function dispend() { // TODO Auto-generated method stub echo 'opps, it appears that we don’t have any juice left<br />'; }}

SoldState.php

<?phprequire_once ’State.php’;class SoldState implements State{ /** * 飲料機的實例 * * @var object */ private $_juiceMachine; /** * 構(gòu)造方法,主要用于初始化飲料機實例 * */ public function __construct($juiceMachine){ $this->_juiceMachine = $juiceMachine; } /* (non-PHPdoc) * @see State::insertCoin() */ public function insertCoin() { // TODO Auto-generated method stub echo 'wait a minute, we are giving you a bottle of juice<br />'; } /* (non-PHPdoc) * @see State::retreatCoin() */ public function retreatCoin() { // TODO Auto-generated method stub echo 'sorry, you already clicked the botton<br />'; } /* (non-PHPdoc) * @see State::clickButton() */ public function clickButton() { // TODO Auto-generated method stub echo 'click twice does’nt get you two bottle of juice<br />'; } /* (non-PHPdoc) * @see State::dispend() */ public function dispend() { $this->_juiceMachine->decJuice(); if($this->_juiceMachine->getCount() <= 0){ echo 'opps, runing out of juice<br />'; //如果這時飲料機中沒有飲料了,將飲料機的狀態(tài)重置為銷售一空 $this->_juiceMachine->setState($this->_juiceMachine->getSoldoutState()); }else{ //將飲料機的狀態(tài)重置為沒有錢 $this->_juiceMachine->setState($this->_juiceMachine->getNomoneyState()); } } }

WinnerState.php

<?phprequire_once ’State.php’; class WinnerState implements State{ /** * 飲料機的實例 * * @var object */ private $_juiceMachine; /** * 構(gòu)造方法,主要用于初始化飲料機實例 */ public function __construct($juiceMachine) { $this->_juiceMachine = $juiceMachine; } /* * (non-PHPdoc) @see State::insertCoin() */ public function insertCoin() { // TODO Auto-generated method stub echo 'wait a minute, we are giving you a bottle of juice<br />'; } /* * (non-PHPdoc) @see State::retreatCoin() */ public function retreatCoin() { // TODO Auto-generated method stub echo 'sorry, you already clicked the botton<br />'; } /* * (non-PHPdoc) @see State::clickButton() */ public function clickButton() { // TODO Auto-generated method stub echo 'click twice does’nt get you two bottle of juice<br />'; } /* * (non-PHPdoc) @see State::dispend() */ public function dispend() { echo 'you are a winner! you get two bottle of juice!<br />'; $this->_juiceMachine->decJuice(); if ($this->_juiceMachine->getCount() > 0) { $this->_juiceMachine->decJuice(); if ($this->_juiceMachine->getCount() <= 0) {echo 'opps, runing out of juice<br />';// 如果這時飲料機中沒有飲料了,將飲料機的狀態(tài)重置為銷售一空$this->_juiceMachine->setState($this->_juiceMachine->getSoldoutState()); } else {// 將飲料機的狀態(tài)重置為沒有錢$this->_juiceMachine->setState($this->_juiceMachine->getSoldoutState()); } } else { echo 'opps, runing out of juice<br />'; // 如果這時飲料機中沒有飲料了,將飲料機的狀態(tài)重置為銷售一空 $this->_juiceMachine->setState($this->_juiceMachine->getSoldoutState()); } }}

JuiceMachine.php

<?phprequire_once ’./state/NomoneyState.php’;require_once ’./state/HasmoneyState.php’;require_once ’./state/SoldState.php’;require_once ’./state/SoldoutState.php’;require_once ’./state/WinnerState.php’; class JuiceMachine{ /** * 記錄糖果機當(dāng)前的狀態(tài),初始化狀態(tài)為售空 * * @var object */ private $_state; /** * 該變量用于記錄飲料機中飲料的數(shù)量 */ private $_count; /** * 構(gòu)造方法,最主要是用來初始化count和state屬性的 */ public function __construct($count) { $this->_state = new SoldoutState($this); $this->_count = $count; // 當(dāng)飲料機中的飲料數(shù)量大于零時,將飲料機的狀態(tài)重置為沒有錢的狀態(tài)。 if ($this->_count > 0) { $this->_state = new NomoneyState($this); } } /* * (non-PHPdoc) @see State::insertCoin() */ public function insertCoin() { // TODO Auto-generated method stub $this->_state->insertCoin(); } /* * (non-PHPdoc) @see State::retreatCoin() */ public function retreatCoin() { // TODO Auto-generated method stub $this->_state->retreatCoin(); } /* * (non-PHPdoc) @see State::clickButton() */ public function clickButton() { $this->_state->clickButton(); //其實發(fā)放糖果是在用戶點擊完按鈕后機器內(nèi)部進(jìn)行的所有沒有必要再寫一個dispend方法 $this->_state->dispend(); } /** * 設(shè)置糖果機的狀態(tài) * * @param State $state */ public function setState(State $state) { $this->_state = $state; } /** * 獲取沒有錢的狀態(tài) */ public function getNomoneyState(){ return new NomoneyState($this); } /** * 獲取有錢的狀態(tài) */ public function getHasmoneyState(){ return new HasmoneyState($this); } /** * 獲取售出的狀態(tài) */ public function getSoldState(){ return new SoldState($this); } /** * 獲取銷售一空的狀態(tài) */ public function getSoldoutState(){ return new SoldoutState($this); } /** * 獲取幸運者的狀態(tài) */ public function getWinnerState(){ return new WinnerState($this); } /** * 獲取飲料機中飲料的數(shù)量 */ public function getCount(){ return $this->_count; } /** * 將飲料數(shù)量減一 */ public function decJuice(){ echo 'now you get you juice<br />'; //飲料機中的飲料數(shù)量減一 $this->_count--; } }

index.php

<?phprequire_once ’JuiceMachine.php’; $juiceMachine = new JuiceMachine(2); $juiceMachine->insertCoin();$juiceMachine->clickButton();

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對大家PHP程序設(shè)計有所幫助。

標(biāo)簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆精品视频在线| 久久精品国产在热久久| 久久99久久久精品欧美| 今天的高清视频免费播放成人| 性色一区二区| 在线日韩av| 蜜桃久久久久久| 国产亚洲精品美女久久 | 91av一区| 国产亚洲电影| 国产探花在线精品一区二区| 日本伊人久久| 国产亚洲人成a在线v网站| 国产美女久久| 国产成人精品一区二区免费看京| 9999国产精品| 欧美91精品| 精品中文一区| 亚洲天堂免费| 国产精品亚洲产品| 亚洲综合电影| 国产二区精品| 五月国产精品| 久久97久久97精品免视看秋霞| 日韩久久电影| 视频一区视频二区中文字幕| 97久久亚洲| 精品国产黄a∨片高清在线| 国产亚洲一区二区手机在线观看| 国内精品福利| 日韩成人午夜精品| av中文字幕在线观看第一页| 一区二区三区四区在线看| 蘑菇福利视频一区播放| 国产精品夜夜夜| 日韩欧美国产精品综合嫩v| av不卡在线看| 91精品蜜臀一区二区三区在线| 在线视频精品| 日韩在线二区| 欧美激情视频一区二区三区免费| 激情91久久| 亚洲黄色中文字幕| 日韩av网站在线免费观看| 亚洲高清影视| 国产精品免费99久久久| 欧洲av一区二区| 99精品99| 国产剧情在线观看一区| 久久精品播放| 日韩高清不卡一区二区| 日韩电影二区| 日韩午夜视频在线| 午夜av成人| 国产日韩精品视频一区二区三区| 人人精品亚洲| 日本少妇一区二区| 国产一区日韩欧美| 国产精品v一区二区三区| 亚洲国内精品| 国产精品调教视频| 亚洲少妇诱惑| 国产精品啊v在线| 在线视频观看日韩| 国产精品成人自拍| 石原莉奈在线亚洲三区| 精品国产网站| 蜜臀精品久久久久久蜜臀| 成人国产精品一区二区免费麻豆| 综合激情在线| 91精品亚洲| 久久精品二区亚洲w码| 亚洲欧洲美洲国产香蕉| 在线日韩av| 精品久久一区| 日韩在线麻豆| 99国产精品久久久久久久成人热| 国产一区二区三区国产精品| 亚洲一区二区三区四区五区午夜| 久久成人高清| 黄色在线一区| 水蜜桃久久夜色精品一区的特点| 欧美在线亚洲综合一区| 日日夜夜免费精品视频| 久久99蜜桃| 在线精品视频一区| 在线看片福利| 亚洲欧美日本视频在线观看| 欧美日韩18| 影音先锋久久| 成人欧美一区二区三区的电影| 日本午夜精品| 久久亚洲美女| 四虎成人av| 欧美国产另类| 国产午夜久久av| 亚洲精品一二| 亚洲免费中文| 影院欧美亚洲| 亚洲成人免费| 亚洲成a人片| 国产一区二区视频在线看| 久久狠狠亚洲综合| 日韩激情精品| 中文字幕免费精品| 久久国产高清| 亚洲成人一区| 欧美亚洲国产激情| 成人一区不卡| 国产一区二区三区天码| 麻豆精品一区二区综合av| 久久国产乱子精品免费女| 日韩中文字幕| 日韩在线观看中文字幕| 亚洲精品成人一区| 亚洲资源在线| 亚洲精品一区二区在线播放∴| 中文一区在线| 亚洲欧美久久久| 免费不卡在线观看| 中文字幕日韩高清在线| 日韩国产欧美一区二区三区| 日本在线视频一区二区| 在线亚洲观看| 精品五月天堂| 91欧美在线| 首页国产精品| 宅男在线一区| 中文字幕成人| 国产精品成人3p一区二区三区| 精品一级视频| 日韩综合一区| 久久av国产紧身裤| 欧美精品成人| 国产成年精品| 999久久久国产精品| 婷婷综合社区| 亚洲色图网站| 一区二区三区四区日韩| 亚州欧美在线| 国产精品亚洲综合色区韩国| 久久精品色播| 麻豆精品蜜桃| 欧美日韩国产亚洲一区| 视频一区视频二区中文| 麻豆精品91| 日韩精品亚洲专区在线观看| 欧美国产极品| 91精品国产自产在线观看永久∴| 亚洲天堂黄色| 久久亚洲国产精品一区二区| 蜜桃视频免费观看一区| 欧美天堂一区| 精品免费视频| 久久精品影视| 日韩高清电影免费| 91成人网在线观看| 91精品在线观看国产| 亚洲激情中文| 国产资源在线观看入口av| 免费视频久久| 在线一区二区三区视频| 久久久久美女| 国产情侣久久| 日本中文字幕不卡| 国产精品激情| 你懂的国产精品永久在线| 国产欧美亚洲精品a| 亚洲特级毛片| 都市激情国产精品| av在线最新| 国精品一区二区| 国产一区二区三区精品在线观看| 国产亚洲福利| 国产一区二区三区久久久久久久久| 欧美另类专区| 中文字幕av一区二区三区人| 视频一区二区不卡| 中文字幕av亚洲精品一部二部| av资源中文在线| 国产精品v一区二区三区| 日韩亚洲精品在线| 亚洲在线成人| 欧洲精品一区二区三区| 成人国产精品一区二区免费麻豆| 日本综合精品一区| 99视频一区| 一区三区视频| av亚洲在线观看| 老鸭窝亚洲一区二区三区| 水蜜桃久久夜色精品一区的特点 | 天堂中文av在线资源库| 中文字幕日韩高清在线| 欧美亚洲在线日韩| 好吊日精品视频 | 久久最新视频| 精品99在线| 日韩一区网站| 日本久久成人网| 国产精品igao视频网网址不卡日韩|