PHP设计模式--状态模式

今天学习的是
状态模式(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点积分,铂金会员

    原文作者:战国墨竹
    原文地址: https://blog.csdn.net/xhanguomzhu/article/details/79986533
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞