资讯专栏INFORMATION COLUMN

PHP设计模式——状态模式

Coding01 / 1508人阅读

摘要:前言状态设计模式是提出的最吸引人的模式之一,也是一种最有用的模式。状态模式的作用就是允许对象在状态改变时改变其行为。还有很多其他模拟应用不一定是游戏也依赖于状态模式。相关资料状态模式

前言

状态设计模式是Gof提出的最吸引人的模式之一,也是一种最有用的模式。游戏通常就采用状态模式,因为游戏中的对象往往会非常频繁地改变状态。状态模式的作用就是允许对象在状态改变时改变其行为。还有很多其他模拟应用(不一定是游戏)也依赖于状态模式。本文将会谈到并举例说明。
按照传统思维,如果有多个状态的话一般就是用if、else if、switch处理了,但是这类的代码看起来极其不美观,最重要的是没什么拓展性,维护性,复用性,还会出现“牵一发而动全身”的情况。如果把这些状态封装起来,就可以减少大量的判断,那么就要用状态模式了。

效果图

需求分析

1、代码遵循可拓展性强,可维护性强,复用性强,杜绝”牵一发而动全身”的情况。
2、减少使用大量的if、else if、switch判断。

核心代码

1、Work.php(它定义了时间程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的具体对象来处理。)

current = new EarlyMorning();  
    }
    //设置状态  
    public function SetState($s)  
    {
        $this->current = $s;  
    }  
  
    public function WriteCode()  
    { 
       return $this->current->WriteCode($this);  
    }  
}  

2、IState.php(定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。)


3、EarlyMorning.php(实现抽象状态定义的接口。)

  
//早晨工作状态  
class EarlyMorning implements IState  
{ 
    public function WriteCode($w)  
    {  
        if($w->hour<6)  
        {  
           return Yii::t("yii","Good Early morning"); 
        }else{  
            $w->SetState(new GoodMorning());  
           return $w->WriteCode();  //注意:这里必须都要return返回,否则调用客户端代码的时候无法赋值给$call。
        }   
           
    }  
} 

//早上工作状态  
class GoodMorning implements IState  
{ 
    public function WriteCode($w)  
    {  
        if($w->hour<9)  
        {  
           return Yii::t("yii","Good morning"); 
        }else{  
            $w->SetState(new GoodForenoon());  
           return $w->WriteCode();  
        }    
    }  
} 

//上午工作状态  
class GoodForenoon implements IState  
{ 
    public function WriteCode($w)  
    {   
        if($w->hour<12)  
        { 
           return Yii::t("yii","Good forenoon"); 
        }else{  
            $w->SetState(new GoodNoon());  
           return $w->WriteCode();  
        }    
    }  
} 

//中午工作状态  
class GoodNoon implements IState  
{ 
    public function WriteCode($w)  
    { 
        if($w->hour<14)  
        {  
           return Yii::t("yii","Good noon"); 
        }else{  
            $w->SetState(new GoodAfternoon());  
           return $w->WriteCode();  
        }    
    }  
} 

//下午工作状态  
class GoodAfternoon implements IState  
{ 
    public function WriteCode($w)  
    {  
        if($w->hour<17)  
        {  
           return Yii::t("yii","Good afternoon"); 
        }else{  
            $w->SetState(new GoodDusk());  
           return $w->WriteCode();  
        }    
    }  
}

//傍晚工作状态  
class GoodDusk implements IState  
{ 
    public function WriteCode($w)  
    { 
        if($w->hour<19)  
        {  
           return Yii::t("yii","Good dusk"); 
        }else{  
            $w->SetState(new GoodNight());  
           return $w->WriteCode();  
        }   
    }  
} 

//晚上工作状态  
class GoodNight implements IState  
{ 
    public function WriteCode($w)  
    {  
        if($w->hour<22)  
        {  
           return Yii::t("yii","Good night"); 
        }else{  
            $w->SetState(new GoodAtNight());  
           return $w->WriteCode();  
        }   
    }  
} 

//夜里工作状态  
class GoodAtNight implements IState  
{ 
    public function WriteCode($w)  
    {  
        return Yii::t("yii","Good at night");  
    }  
}   
调用客户端代码
hour = date("H");  
$call=$emergWork->WriteCode(); 
增加状态

1、例如:在原来的应用中增加个“半夜的状态”。
1.1、在原夜里工作状态类增加个if判断,符合条件时调用半夜的工作状态。

hour<23)  
        {   
            return Yii::t("yii","Good at night");  
        }else{  
            $w->SetState(new Midnight());  
            return  $w->WriteCode();  
        }   
    }  
}

1.2、新增一个半夜工作状态类,里面写要执行的行为。


怎么样,增加一个状态是不是很简单?拓展性非常好。

提醒注意

1、实现状态接口类中的$w->WriteCode()必须要return返回,否则调用客户端代码的时候无法赋值给$call,会直接echo输出。
2、实现状态接口类中的public function WriteCode($w)方法里的$w对象类应该是Work对象,不能是当前类的对象。

总结分析

1、优点
1.1、状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
1.2、所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。
1.3、状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。
2、缺点
2.1、导致较多的ConcreteState子类。

相关资料

状态模式

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30420.html

相关文章

  • PHP设计模式之观察者模式

    摘要:概念观察者模式属于行为模式,是定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。观察者模式符合接口隔离原则,实现了对象之间的松散耦合。 概念 观察者模式属于行为模式,是定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。 当一个对象状态发生改变后,会影响到其他几个对象的改变,这...

    phpmatt 评论0 收藏0
  • PHP设计模式——观察者模式

    摘要:设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有订阅对象都能得到通知。类与观察者设计模式没有内在的关系,不过通过它其内置的和方法可以很方便的将观察者实例与一个主题实例相关联以及解除关联。 前言 知识就是作为观察者所获得的结论,经过科学培训的观察者会为我们提供所有能感知的现实。设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有...

    Barrior 评论0 收藏0
  • PHP设计模式——观察者模式

    摘要:设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有订阅对象都能得到通知。类与观察者设计模式没有内在的关系,不过通过它其内置的和方法可以很方便的将观察者实例与一个主题实例相关联以及解除关联。 前言 知识就是作为观察者所获得的结论,经过科学培训的观察者会为我们提供所有能感知的现实。设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有...

    KoreyLee 评论0 收藏0
  • PHP设计模式——观察者模式

    摘要:设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有订阅对象都能得到通知。类与观察者设计模式没有内在的关系,不过通过它其内置的和方法可以很方便的将观察者实例与一个主题实例相关联以及解除关联。 前言 知识就是作为观察者所获得的结论,经过科学培训的观察者会为我们提供所有能感知的现实。设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有...

    lifefriend_007 评论0 收藏0
  • PHP基础

    摘要:分别为适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。设计模式五适配器模式适配器模式将某个对象的接生成器和协程的实现在这篇文章中,作者针对那些比较难以理解的概念,以一个更为通俗的方式去讲明白。。 PHP 源码注解 PHP 的详细源码注解 PHP 字符串操作整理 一些有关字符串的常用操作。 Redis 常见七种使用场景 (PHP 实战) 这篇文章主要介绍利用 R...

    HtmlCssJs 评论0 收藏0

发表评论

0条评论

Coding01

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<