初识PHP设计模式--状态模式

xiaoxiao2021-02-28  49

新年过后放了那么多天假,走亲访友之后,难得清闲可以回来学习学习。 --大年初三  今天学习的是 状态模式(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://www.6miu.com/read-2619450.html

最新回复(0)