• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP中什么是状态模式?通过实例来了解它

php 搞代码 3年前 (2022-01-21) 33次浏览 已收录 0个评论

在之前的文章《一起聊聊PHP中的单例模式》中我们介绍了PHP中的单例模式,下面本篇文章带大家了解一下PHP设计模式中的状态模式

状态模式从字面上其实并不是很好理解。这里的状态是什么意思呢?保存状态?那不就是备忘录模式了。其实,这里的状态是类的状态,通过改变类的某个状态,让这个类感觉像是换了一个类一样。说起来有点拗口吧,先学习概念之后再看。

Gof类图及解释

GoF定义:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类

GoF类图

代码实现

class Context
{
    private $state;
    public function SetState(State $state): void
    {
        $this->state = $state;
    }
    public function Request(): void
    {
        $this->state = $this->state->Handle();
    }
}

一个上下文类,也可以看作是目标类,它的内部有一个状态对象。当调用Request()的时候,去调用状态类的Handle()方法。目的是当前上下文类状态的变化都由外部的这个状态类来进行操纵。

interface State
{
    public function Handle(): State;
}

class ConcreteStateA implements State
{
    public function Handle(): State
    {
        echo '当前是A状态', PHP_EOL;
        return new ConcreteStateB();
    }
}

class ConcreteStateB implements State
{
    public function Handle(): State
    {
        echo '当前是B状态', PHP_EOL;
        return new ConcreteStateA();
    }
}

抽象状态接口及两个具体实现。这两个具体实现实际上是在相互调用。实现的效果就是上下文类每调用一次Request()方法,内部的状态类就变成别一个状态。就像一个开关,在打开与关闭中来回切换一样。

$c = new Context();
$stateA = new ConcreteStateA();
$c->SetState($stateA);
$c->Request();
$c->Request();
$c->Request();
$c->Request();

客户端的实现,实例化上下文对象并设置初始的状态,然后通过不停的调用Request()对象来实现开关状态的切换。

  • 看出门道了嘛?这里把状态的变化给封装到外部的实现类去了,并不是这个上下文或者目标类内部来进行状态的切换了
  • 那么状态模式的意义呢?这个默认类图的例子过于简单,其实状态模式的真正目的是为了解决复杂的if嵌套问题的,把复杂的if嵌套条件放到一个个的外部状态类中去判断,在后面的实例中我们会看到
  • 适用于:一个对象的行为取决于它的状态,并且它的必须在运行时刻根据状态改变自己的行为;一个操作中含有大量的多分支条件语句,且这些分支依赖于该对象的状态;
  • 状态模式的特点是:它将与特定状态相关的行为局部化;它使得状态转换显式化;State对象可以被共享;
  • 常见于订单系本文来源gaodaimacom搞#^代%!码&网*
    搞代gaodaima码

    统、会员系统、OA系统中,也就是流程中会出现各种状态变化的情况,都可以使用状态模式来进行整体的设计与架构

我们的手机系统内定制了自己的商城系统,可以在手机上方便的下单购买我们的商品。一个订单(Context)会有多种状态(State),比如未支付、已支付、订单完成、订单退款等等一大堆状态。我们把这些状态都放在了对应的状态类里去实现,不同的状态类都会再去调用该状态下一步的动作,比如已支付后就等待收货、退款后就等待买家填写物流单号等,这样,状态模式就在我们的商城中被灵活的运用起来咯!!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP中什么是状态模式?通过实例来了解它

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址