PHP设计模式——状态模式

声明:本系列博客參考资料《大话设计模式》,作者程杰。


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


        UML类图:

       


         角色:          

         上下文环境Work它定义了客户程序须要的接口并维护一个详细状态角色的实例,将与状态相关的操作托付给当前的详细对象来处理

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

         详细状态(AmState):实现抽象状态定义的接口


         核心代码:

         

<?

php /** * Created by PhpStorm-> * User: Jang * Date: 2015/6/10 * Time: 10:34 */ //状态接口 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); } }


          调用client測试代码:

        

//-------------------------状态模式-------------------------
require_once "./State/State.php";

$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();

         适用场景:     

         1.一个对象的行为取决于它的状态,而且它必须在执行时刻依据状态改变它的行为

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

          

         长处

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

       2.全部状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类非常easy地添加新的状态和转换。

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

         

           缺点

    导致较多的ConcreteState子类    


欢迎关注我的视频课程。地址例如以下,谢谢。


   PHP面向对象设计模式
原文地址:https://www.cnblogs.com/wgwyanfs/p/6756664.html