iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP中状态模式指的是什么
  • 119
分享到

PHP中状态模式指的是什么

2023-06-20 17:06:07 119人浏览 薄情痞子
摘要

这篇文章主要介绍了PHP中状态模式指的是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。状态模式从字面上其实并不是很好理解。这里的状态是什么意思呢?保存状态?那不就是备忘录

这篇文章主要介绍了PHP中状态模式指的是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

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

Gof类图及解释

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

GoF类图

PHP中状态模式指的是什么

代码实现

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对象可以被共享;

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

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

完整代码:https://GitHub.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state.php

实例

通常的商城应用中都会有会员体系的存在,一般等级越高的会员可以享受的折扣也会越多,这个时候,运用状态模式就能很轻松的获得会员的等级折扣。当然,最主要的是,使用状态模式可以在需要添加或者删除会员等级时只添加对应的会员折扣状态子类就可以了。其他业务代码都不需要变动,我们一起来看看具体实现吧!

会员折扣图

PHP中状态模式指的是什么

完整源码Https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state-member.php

<?phpclass Member{    private $state;    private $score;    public function SetState($state)    {        $this->state = $state;    }    public function SetScore($score)    {        $this->score = $score;    }    public function GetScore()    {        return $this->score;    }    public function discount()    {        return $this->state->discount($this);    }}interface State{    public function discount($member);}class PlatinumMemeberState implements State{    public function discount($member)    {        if ($member->GetScore() >= 1000) {            return 0.80;        } else {            $member->SetState(new GoldMemberState());            return $member->discount();        }    }}class GoldMemberState implements State{    public function discount($member)    {        if ($member->GetScore() >= 800) {            return 0.85;        } else {            $member->SetState(new SilverMemberState());            return $member->discount();        }    }}class SilverMemberState implements State{    public function discount($member)    {        if ($member->GetScore() >= 500) {            return 0.90;        } else {            $member->SetState(new GeneralMemberState());            return $member->discount();        }    }}class GeneralMemberState implements State{    public function discount($member)    {        return 0.95;    }}$m = new Member();$m->SetState(new PlatinumMemeberState());$m->SetScore(1200);echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL;$m->SetScore(990);echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL;$m->SetScore(660);echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL;$m->SetScore(10);echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL;

说明

  • 如果不使用状态模式,在Member的discount()方法中,我们可能需要写很多层if...else...判断条件

  • 同时,这也带来了方法体会越来越长,越来越难以维护的问题

  • 状态模式正是为了解决这个问题而存在的

  • 当discount()行为的结果依赖于Member对象本身的状态(会员分)时,状态模式就是最佳的选择了,也就是上面所说的一个对象的行为取决于它的状态

感谢你能够认真阅读完这篇文章,希望小编分享的“PHP中状态模式指的是什么”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网PHP编程频道,更多相关知识等着你来学习!

--结束END--

本文标题: PHP中状态模式指的是什么

本文链接: https://www.lsjlt.com/news/298880.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP中状态模式指的是什么
    这篇文章主要介绍了PHP中状态模式指的是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。状态模式从字面上其实并不是很好理解。这里的状态是什么意思呢?保存状态?那不就是备忘录...
    99+
    2023-06-20
  • Python设计模式中的状态模式是什么
    这篇文章将为大家详细讲解有关Python设计模式中的状态模式是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。状态模式状态模式,当对象的内部状态发生了改变的时候,允许对象执行不同的流程。优点:封装了状态...
    99+
    2023-06-29
  • PHP入门指南:状态模式
    PHP 入门指南:状态模式状态模式是一种行为型设计模式,它允许对象在不同的内部状态之间进行转换,而这些状态会触发不同的行为操作。本文将介绍状态模式的概念、实现方式以及使用场景,来帮助 PHP 开发者更好地理解和应用这个重要的设计模式。概念状...
    99+
    2023-05-20
    PHP 入门指南 状态模式
  • http协议无状态中的 "状态" 指的是什么
    这篇文章主要介绍“http协议无状态中的 "状态" 指的是什么”,在日常操作中,相信很多人在http协议无状态中的 "状态" 指的是什么问题上存在疑惑,小编查阅了各式...
    99+
    2024-04-02
  • Vue简单状态管理之store模式是什么
    这篇文章给大家分享的是有关Vue简单状态管理之store模式是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述store 状态管理模式的实现思想很简单,就是定义一个 store 对象,对象里有 state ...
    99+
    2023-06-15
  • PHP中多态性指的是什么
    本文小编为大家详细介绍“PHP中多态性指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP中多态性指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在PHP中,多态性是指同一个操作作用于不同的类...
    99+
    2023-07-05
  • PHP无状态的含义是什么
    今天小编给大家分享一下PHP无状态的含义是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。第一部分:PHP无状态概述HTT...
    99+
    2023-07-05
  • php中多态指的是什么意思
    这篇文章主要介绍php中多态指的是什么意思,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php是什么语言php,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext Preprocessor)的缩...
    99+
    2023-06-15
  • dfu指的是什么模式
    这篇文章将为大家详细讲解有关dfu指的是什么模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。dfu模式是即iPhone固件的强制升降级模式,实际意思就是iPhone固件的强制升降级模式,它一般是在iPh...
    99+
    2023-06-14
  • php静态化指的是什么
    本篇内容主要讲解“php静态化指的是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php静态化指的是什么”吧!PHP静态化就是使网站生成页面以静态HTML的形式展现在访客面前;PHP静态化分...
    99+
    2023-07-04
  • 电脑脱机状态指的是什么意思
    小编给大家分享一下电脑脱机状态指的是什么意思,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!电脑脱机状态就是指电脑没有连接到网络,处于离线状态。通常情况下,浏览器如果没有连接到网络,那么浏览器会默认使用脱机浏览。脱机状态就是...
    99+
    2023-06-13
  • Python设计模式中的状态模式你了解吗
    目录状态模式应用场景代码示例总结状态模式 状态模式,当对象的内部状态发生了改变的时候,允许对象执行不同的流程。 优点: 封装了状态转换规则。枚举了可能的状态,在枚举状态之前需要确定...
    99+
    2024-04-02
  • 微信8.0版本中微信新状态指的是什么
    这篇文章将为大家详细讲解有关微信8.0版本中微信新状态指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。微信新状态是微信8.0版本增加的一个新功能,将微信更新至8.0版本后,在“我”界面个人栏目下,...
    99+
    2023-06-06
  • PHP中的策略模式是什么
    这篇文章主要讲解了“PHP中的策略模式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中的策略模式是什么”吧!策略模式,又称为政策模式,属于行为型的设计模式。Gof类图及解释GoF...
    99+
    2023-06-20
  • PHP中的享元模式是什么
    本篇内容介绍了“PHP中的享元模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!享元模式,“享元”这两个字在中文里其实并没有什么特殊的...
    99+
    2023-06-20
  • PHP中的桥接模式是什么
    这篇文章主要讲解了“PHP中的桥接模式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中的桥接模式是什么”吧!桥接模式,在程序世界中,其实就是组合/聚合的代名词。为什么这么说呢?熟...
    99+
    2023-06-20
  • PHP中的门面模式是什么
    本篇内容介绍了“PHP中的门面模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!门面模式,也叫外观模式。不管是门面还是外观,都是我们对...
    99+
    2023-06-20
  • PHP中的代理模式是什么
    本篇内容介绍了“PHP中的代理模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代理人这个职业在中国有另外一个称呼,房产经济人、保险经...
    99+
    2023-06-20
  • php中Codeigniter的mvc模式是什么
    这篇文章将为大家详细讲解有关php中Codeigniter的mvc模式是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发环境。...
    99+
    2023-06-14
  • PHP中的中介者模式是什么
    本篇内容介绍了“PHP中的中介者模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!上回说道,我们在外打工的经常会和一类人有很深的接触,...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作