状态设计模式的关键就是,环境中拥有所需的全部状态对象,每个状态对象又引用了环境对象;环境对象通过维护一个当前状态属性(用于存放状态对象)从而对所需的全部状态对象产生影响。

下面演示了一个简单的状态设计模式,状态设计模式的核心在于47-49行:

 <?php

 interface Status
{
function getProperty();
function getContext();
} abstract class BaseStatus implements Status
{
public $context; public function __construct(BaseContext $context)
{
$this->context = $context;
} public function getContext()
{
return $this->context;
}
} abstract class BaseContext
{
public $currentStatus; public function changeStatus(Status $status)
{
$this->currentStatus = $status;
} public function statusDetail()
{
return $this->currentStatus->getProperty();
}
} class Context extends BaseContext
{
public $status1;
public $status2;
public $status3; public function __construct()
{
$this->status1 = new Status1($this);
$this->status2 = new Status2($this);
$this->status3 = new Status3($this); $this->currentStatus = $this->status1;
}
} class Status1 extends BaseStatus
{
public function getProperty()
{
echo 'I am status1'.PHP_EOL;
if ($this->getContext()->currentStatus instanceof self) {
echo 'here is status two and status three<br/>';
$this->context->status2->getProperty();
echo '<br/>';
$this->context->status3->getProperty();
echo '<br/>';
}
}
} class Status2 extends BaseStatus
{
public function getProperty()
{
echo 'I am status2'.PHP_EOL;
if ($this->getContext()->currentStatus instanceof self) {
echo 'here is status one and status three<br/>';
$this->context->status1->getProperty();
echo '<br/>';
$this->context->status3->getProperty();
echo '<br/>';
}
}
} class Status3 extends BaseStatus
{
public function getProperty()
{
echo 'I am status3'.PHP_EOL;
if ($this->getContext()->currentStatus instanceof self) {
echo 'here is status one and status two<br/>';
$this->context->status1->getProperty();
echo '<br/>';
$this->context->status2->getProperty();
echo '<br/>';
}
}
} $context = new Context(); $context->statusDetail(); $context->changeStatus($context->status2); $context->statusDetail(); $context->changeStatus($context->status3); $context->statusDetail();

运行结果:

I am status1 here is status two and status three
I am status2 
I am status3 
I am status2 here is status one and status three
I am status1 
I am status3 
I am status3 here is status one and status two
I am status1 
I am status2

可见,每次环境对象切换状态的时候,环境对象内的任何修改对于所有状态对象都是同步可见的(状态对象均引用了环境对象)。

php状态设计模式的更多相关文章

  1. State状态设计模式

    1.状态模式:改变对象的行为 一个用来改变类的(状态的)对象. 2:问题:当你自己实现 State 模式的时候就会碰到很多细节的问题,你必须根据自己的需要选择合适的实现方法, 比如用到的状态(Stat ...

  2. State Design Pattern 状态设计模式

    设置好内部状态,然后依据不同的函数作为行为模式,进行状态转换. 有点像Finite Automata算法,两者的思想是一样的. 会Finite Automata,那么这个设计模式就非常easy了. # ...

  3. 使用C# (.NET Core) 实现状态设计模式 (State Pattern)

    本文的概念性内容来自深入浅出设计模式一书 项目需求 这是一个糖果机的需求图. 它有四种状态, 分别是图中的四个圆圈: No Quarter: 无硬币 Has Quater 有硬币 Gumball So ...

  4. State模式(状态设计模式)

    State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于 ...

  5. python设计模式之状态模式

    python设计模式之状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态 ...

  6. 深入探索Java设计模式(二)之策略模式

    策略设计模式是Java API库中常见的模式之一.这与另一个设计模式(称为状态设计模式)非常相似.本文是在学习完优锐课JAVA架构VIP课程—[框架源码专题]中<学习源码中的优秀设计模式> ...

  7. python设计模式第2版

    python设计模式第2版 目录 第1章 设计模式简介 1 1.1 理解面向对象编程 1 1.1.1 对象 2 1.1.2 类 2 1.1.3 方法 2 1.2 面向对象编程的主要概念 3 1.2.1 ...

  8. C#设计模式:状态者模式(State Pattern)

    一,什么是状态设计模式? 1,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 2,当一个对象的内部状态改变时允许改变其行为,这个对象看起来像是 ...

  9. 第18章 备忘录模式(Memento Pattern)

    原文  第18章 备忘录模式(Memento Pattern) 备忘录模式       概述: 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Toke ...

随机推荐

  1. iOS Runtime 实操练习

    iOS  Runtime 知识详解: http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/ 一般可以运行Runtime进行以下操作 ...

  2. video自动填充满父级元素

    想要video能自动填充慢父div的大小,只要给video标签加上style="width= 100%; height=100%; object-fit: fill"即可. obj ...

  3. 【转载】 pytorch笔记:06)requires_grad和volatile

    原文地址: https://blog.csdn.net/jiangpeng59/article/details/80667335 作者:PJ-Javis 来源:CSDN --------------- ...

  4. mod_conference ESL控制二(事件)

    根据上篇所述功能需求,esl需要处理以下几类事件: ESL_EVENT_CHANNEL_*  #channel相关事件,用户判断参会者是否应答.计费 DTMF事件 #识别参会者按键,根据按键进行操作( ...

  5. python retrying retry

    在写业务时, 有个业务需要在return某种情况下,进行重试. 代码类似于下面 from retrying import retry def verify(self): try: return sel ...

  6. javascript常见的几种事件类型

    第一种事件类型:onchange() <body> <select id="sheng" onchange="fn1();"> < ...

  7. vs2017 打开cs文件提示无法识别的GUID格式

    总结一句话 no zuo no die. 是我自己在注册表中给vs增加了自动以管理员身份运行,把值给错了,弄成了 ~ RUNASADMIN WIN7RTM, 改成 ~ RUNASADMIN 后OK.还 ...

  8. 一篇讲解如何调试pg 扩展的文章

    以下链接这片关于pg 扩展调试的文章挺不错,记录下 http://big-elephants.com/2015-10/writing-postgres-extensions-part-iii/     ...

  9. jQuery基础(二)DOM

    DOM节点的创建 jQuery节点创建与属性的处理 创建元素节点: $("<div></div>") 创建为文本节点: $("<div> ...

  10. Linux umask命令详解

    Linux umask命令 Linux umask命令指定在建立文件时预设的权限掩码.一般来说,umask命令是在/etc /profile文件中设置的 umask可用来设定[权限掩码].[权限掩码] ...