今天学习的是
状态模式(State)
,一种行为型模式。
状态模式从代码结构上分析有点和职责链模式相似,每个状态有自己的上限,一旦超出会成为另一种状态。
状态模式的定义:允许一个对象在其内部状态改变时改变它的行为。
而状态模式就是分离对象的状态,封装到专门的状态类中。
优点是,把各个状态分离开,便于横向扩展,灵活性高。
如果光学习概念其实比较抽象,下面举一个实用的小例子:
所有做过互联网商城的公司都知道,消费会有积分,而积分的大小决定了该名会员的等级。
等级比方说有:黄金,铂金,钻石之类的。
代码如下:
<?php
header("Content-Type:text/html;charset=utf-8");
require_once "State.php";
$state = new State();
// 积分为 500的时候
$state->score = 500;
$state->Grade();
// 积分为1000的时候
$state->score = 1000;
$state->Grade();
// 积分为10000的时候
$state->score = 100000;
$state->Grade();
<?php
// 状态接口
interface IState
{
/**
* 显示等级接口函数 子类必须执行
* @access public
* @param object $A
*/
public function Grade(State $A);
}
// 等级黄金
Class Golden implements IState
{
/**
* 显示等级
* @access public
* @param object $A
*/
public function Grade(State $A)
{
if($A->score > 0 && $A->score < 1000)
{
echo "{$A->score}点积分,黄金会员<br/>";
}
else
{
// 超出等级 进入下级
$A->SetState(new Platinum());
$A->Grade();
}
}
}
// 等级铂金
Class Platinum implements IState
{
/**
* 显示等级
* @access public
* @param object $A
*/
public function Grade(State $A)
{
if($A->score < 10000 && $A->score >= 1000)
{
echo "{$A->score}点积分,铂金会员<br/>";
}
else
{
// 超出等级 进入下级
$A->SetState(new Diamond());
$A->Grade();
}
}
}
// 等级钻石
Class Diamond implements IState
{
/**
* 显示等级
* @access public
* @param object $A
*/
public function Grade(State $A)
{
if($A->score >= 10000)
{
echo "{$A->score}点积分,铂金会员<br/>";
}
}
}
// 统一状态类
Class State
{
/**
* 初始化对象
* @var object
*/
private $first;
/**
* 积分值
* @var int
*/
public $score;
/**
* 构造函数 初始化
* @access public
*/
function __construct()
{
$this->first = new Golden();
}
/**
* 设置下级等级
* @access public
* @param object $s
*/
function SetState(IState $s)
{
$this->first = $s;
}
/**
* 显示等级
* @access public
*/
function Grade()
{
$this->first->Grade($this);
}
}
输出结果:
500点积分,黄金会员
1000点积分,铂金会员
100000点积分,铂金会员