首页 > 编程语言 >php中的状态模式

php中的状态模式

时间:2022-11-17 12:38:42浏览次数:43  
标签:状态 emergWork hour Work 模式 WriteCode php public



概念

 

状态模式当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

 

角色

上下文环境(Work):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的具体对象来处理。

抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。

具体状态(AmState):实现抽象状态定义的接口。

 

场景

 

1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

优点

1.状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

2.所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。

3.状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。

缺点

导致较多的ConcreteState子类

 

示例


<?php
//状态接口
interface IState
{
function WriteCode(Work $w);
}

//上午工作状态
class AmState implements IState
{
public function WriteCode(Work $w)
{
if ($w->hour <= 12) {
echo "当前时间:{$w->hour}点,上午工作;犯困,午休。<br/>";
} else {
$w->SetState(new PmState());
$w->WriteCode();
}
}
}

//下午工作状态
class PmState implements IState
{
public function WriteCode(Work $w)
{
if ($w->hour <= 17) {
echo "当前时间:{$w->hour}点,下午工作状态还不错,继续努力。<br/>";
} else {
$w->SetState(new NightState());
$w->WriteCode();
}
}
}

//晚上工作状态
class NightState implements IState
{

public function WriteCode(Work $w)
{
if ($w->IsDone) {
$w->SetState(new BreakState());
$w->WriteCode();
} else {
if ($w->hour <= 21) {
echo "当前时间:{$w->hour}点,加班哦,疲累至极。<br/>";
} else {
$w->SetState(new SleepState());
$w->WriteCode();
}
}
}
}

//休息状态
class BreakState implements IState
{

public function WriteCode(Work $w)
{
echo "当前时间:{$w->hour}点,下班回家了。<br/>";
}
}

//睡眠状态
class SleepState implements IState
{

public function WriteCode(Work $w)
{
echo "当前时间:{$w->hour}点,不行了,睡着了。<br/>";
}
}

//工作状态
class Work
{
private $current;

public function Work()
{
$this->current = new AmState();
}

public $hour;

public $isDone;

public function SetState(IState $s)
{
$this->current = $s;
}

public function WriteCode()
{
$this->current->WriteCode($this);
}
}


//测试
$emergWork = new Work();
$emergWork->hour = 9;
$emergWork->WriteCode();
$emergWork->hour = 10;
$emergWork->WriteCode();
$emergWork->hour = 13;
$emergWork->WriteCode();
$emergWork->hour = 14;
$emergWork->WriteCode();
$emergWork->hour = 17;
$emergWork->WriteCode();

$emergWork->IsDone = true;
$emergWork->IsDone = false;

$emergWork->hour = 19;
$emergWork->WriteCode();

$emergWork->hour = 22;
$emergWork->WriteCode();


 

 

 

标签:状态,emergWork,hour,Work,模式,WriteCode,php,public
From: https://blog.51cto.com/u_6353447/5860632

相关文章

  • php中介者模式
    概念 中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改。一般处理具有类似属性,需要保持同步的非耦合对象......
  • 状态机编码方式:二进制binary、独热码 one-hot、格雷码 gray
    关于有限状态机中常用的三种编码方式各自的优缺点 二进制编码:优点:每次加一,编码方式简单;压缩编码,使用寄存器少缺点:翻转次数多,功耗大;易出现毛刺;状态跳转需要组合逻辑多;......
  • the real ugly parts of PHP (ZZ)
    来源:https://www.amazon.com/gp/customer-reviews/R2D9T7KNTHFC5A IshouldwarnthereaderthatIneverwasaPHPenthousiastinspiteofbeingable,though,to......
  • php 反序列化字符串逃逸
    这里总结一下反序列化字符串逃逸的知识点反序列化字符串逃逸分为被过滤后字符增多和字符减少的情况这里就不讲之前的基础知识了大家看其它师傅写的博客就可以了很多师......
  • 软件设计模式白话文系列(十二)组合模式
    1、模式描述组合模式属于结构型模式,把多个对象组成树状结构来表示局部与整体,这样用户可以以相同的方式对待单个对象和组合对象。需要注意的是这里的组合和之前系列中,我们......
  • Android中保存当前按钮的状态 按back键返回之后再次进入没有改变
    博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,......
  • CTFshow刷题日记-WEB-PHP特性(下篇123-150)
    web123,125,126error_reporting(0);highlight_file(__FILE__);include("flag.php");$a=$_SERVER['argv'];$c=$_POST['fun'];if(isset($_POST['CTF_SHOW'])&&isset($_POST['C......
  • 工厂模式
    工厂模式应该是用的频次最高的,他管理着对对象的创建。下面简单介绍下简单工厂、工厂方法、抽象工厂。一、简单工厂应该是其中最简单最直接明了的,一个接口、N个实现,再一组......
  • 010005 PHP 第一个计算长方体的体积公式
    <?phpheader('Content-Type:text/html;charset=utf-8');include'./assets/php/head.php';/***第一个计算长方体的体积公式*已知长是40-10,宽是30+20,高是35*2......
  • php面向对象 final关键字
    //final修饰的类无法被子类继承finalclasshuman{}classmanextendshuman{}$m=newman();//Fatalerror:Classmanmaynotinheritfromfinalclass(human)//......