初识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点积分,铂金会员

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值