PHP设计模式入门之状态模式原理与实现方法分析(2)
index.php
<?php require_once 'JuiceMachine.php'; $juiceMachine = new JuiceMachine(1); $juiceMachine->insertCoin(); $juiceMachine->clickButton();
运行的结果是:
you just insert a coin
you clicked, we are giving you a bottle of juice...
now you get you juice
opps, runing out of juice
到目前为止我们的程序运行良好,没有出现什么问题,但是从这些多重的if判断中你是否嗅到了坏代码的味道呢?有一天问题终于出现了,老板希望当用户点击按钮时有10%的概率拿到两瓶饮料,我们需要为饮料机多加一个状态,这时去修改代码就成为了一种灾难,而且很可能会影响到之前的代码,带来新的bug,看看状态模式如何帮助我们度过难关吧!
状态模式的官方定义是:状态模式允许对象在内部状态改变是改变它的行为,对象看起来好像是修改了它的类
用uml类图表示如下:

在我们这个项目中的实际类图如下:

具体实现代码:
State.php
<?php
interface State{
/**
* 插入硬币
*/
public function insertCoin();
/**
* 回退硬币
*/
public function retreatCoin();
/**
* 点击按钮
*/
public function clickButton();
/**
* 发放饮料
*/
public function dispend();
}
NomoneyState.php
<?php
require_once 'State.php';
class NomoneyState implements State{
/**
* 饮料机的实例
*
* @var object
*/
private $_juiceMachine;
/**
* 构造方法,主要用于初始化饮料机实例
*
*/
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 />";
//将饮料机的状态切换成有钱的状态
$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 />";
}
}
内容版权声明:除非注明,否则皆为本站原创文章。
