本文实例讲述了PHP设计模式入门之状态模式原理与实现方法。分享给大家供大家参考,具体如下:
想必大家都用过自动售卖的自动饮料机吧,塞入硬币或纸币,选择想要的饮料,饮料就会在机器的下方滚出。大家有没有相关如果用程序去写一个饮料机要怎么样实现呢?
首先我们可以分享一下这部饮料机有几种状态
一、没有钱的状态
二、有钱的状态
三、售出的状态
四、销售一空的状态
好吧,知道了这些状态之后我们开始写代码了!
JuiceMachine.php
<?php
/**
* 饮料机
* @author ben
*
*/
class JuiceMachine{
/**
* 糖果机一共存在四种状态:没钱,有钱,成功售出以及销售一空
*
* 没钱的状态
* @var INT
*/
const NOMONEY = 0;
/**
* 有钱的状态
* @var INT
*/
const HASMONEY = 1;
/**
* 成功售出的状态
* @var INT
*/
const SOLD = 2;
/**
* 销售一空的状态
* @var INT
*/
const SOLDOUT = 3;
/**
* 记录糖果机当前的状态,初始化状态为售空
* @var INT
*/
private $_state = JuiceMachine::SOLDOUT;
/**
* 该变量用于记录饮料机中饮料的数量
*/
private $_count;
/**
* 构造方法,最主要是用来初始化count和state属性的
*/
public function __construct($count){
$this->_count = $count;
//当饮料机中的饮料数量大于零时,将饮料机的状态重置为没有钱的状态。
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 />";
}
}
/**
* 点击饮料对应的按钮
*/
public function clickButton(){
if($this->_state == JuiceMachine::HASMONEY ){
echo "you clicked, we are giving you a bottle of juice...<br />";
$this->_state = JuiceMachine::SOLD; //改变饮料机的状态为售出模式
$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 />";
}
}
/**
* 发放饮料
*/
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 />";
//饮料机中的饮料数量减一
$this->_count--;
if($this->_count <= 0){
echo "opps, runing out of juice<br />";
//如果这时饮料机中没有饮料了,将饮料机的状态重置为销售一空
$this->_state = JuiceMachine::SOLDOUT;
}else{
//将饮料机的状态重置为没有钱
$this->_state = JuiceMachine::NOMONEY;
}
}elseif($this->_state == JuiceMachine::SOLDOUT){
//其实这种情况不应该出现
echo "opps, it appears that we don't have any juice left<br />";
}
}
}
内容版权声明:除非注明,否则皆为本站原创文章。
