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);
    }
}

          调用客户端测试代码:

        

//-------------------------状态模式-------------------------
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中,所以通过定义新的子类很容易地增加新的状态和转换。

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

         

           缺点

    导致较多的ConcreteState子类    

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

   PHP面向对象设计模式

时间: 2024-10-23 23:08:38

PHP设计模式——状态模式的相关文章

hand first设计模式 -状态模式

状态模式:允许对象在内部状态改变时改变它的的行为.对象看起来好像修改了化的类. 将以超市购物为例--说明状态模式 所有状态抽象类 Java代码 public abstract class BuyStat { //在超市状态 public void inShop() { System.out.println("welcome come our shop,please start shoping"); } //选购商品状态 public void select() { System.out

[Head First设计模式]生活中学设计模式——状态模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式--工厂模式 [Head First设计模式]一个人的平安夜--单例模式 [Head First设计模式]抢票中的设计模式--代理模式 [Head First设计模式]面向对象的3特征5原则 [Head First设计模式]鸭子

22、Python与设计模式--状态模式

一.电梯控制器 电梯在我们周边随处可见,电梯的控制逻辑中心是由电梯控制器实现的.电梯的控制逻辑,即使简单点设计,把状态分成开门状态,停止状态和运行状态,操作分成开门.关门.运行.停止,那流程也是很复杂的.首先,开门状态不能开门.运行.停止:停止状态不能关门,停止:运行状态不能开门.关门.运行.要用一个一个if-else-实现,首先代码混乱,不易维护:二是不易扩展.至于各种设计原则什么的--那该如何实现?在上边的逻辑中,每个操作仅仅是一个操作,状态切换与操作是分离的,这也造成后来操作和状态"相互配

Java设计模式--状态模式

状态模式(别名:状态对象) 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. State Pattern(Another Name: Object for States) Allow an object to alert its behavior when its internal state changes. The object will appear to change its class. 类图 模式的结构与使用 状态模式的结构中包括三种角色. + 环境(Cont

设计模式之禅之设计模式-状态模式

一:状态模式定义        --->当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类        --->状态模式的核心是封装,状态的变更引起了行为的变更,从外部看起来就好像这个对象对应的类发生了改变一样        --->状态模式相对来说比较复杂,它提供了一种对物质运动的另一个观察视角,通过状态变更促使行为的变化,就类似水的状态变更一样,一碗水的初始状态是液态,通过加热转变为气态,状态的改变同时也引起体积的扩大,然后就产生了一个新的行为:鸣笛或顶起壶盖,瓦特

详解C++设计模式编程中对状态模式的运用_C 语言

状态模式:当一个对象的内在状态发生变化时,允许改变其行为,这个对象看来像是改变了其类. 状态模式与策略模式的UML图几乎一模一样,下面列举了两者的不同: (1)可以通过环境类状态的个数来决定是使用策略模式还是状态模式. (2)策略模式的环境类自己选择一个具体策略类,具体策略类无须关心环境类:而状态模式的环境类由于外在因素需要放进一个具体状态中,以便通过其方法实现状态的切换,因此环境类和状态类之间存在一种双向的关联关系. (3)使用策略模式时,客户端需要知道所选的具体策略是哪一个,而使用状态模式时

实例讲解C++设计模式编程中State状态模式的运用场景_C 语言

State模式允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 在面向对象系统的开发和设计过程,经常会遇到一种情况就是需求变更(Requirement Changing),经常我们做好的一个设计.实现了一个系统原型,咱们的客户又会有了新的需求.我们又因此不得不去修改已有的设计,最常见就是解决方案就是给已经设计.实现好的类添加新的方法去实现客户新的需求,这样就陷入了设计变更的梦魇:不停地打补丁,其带来的后果就是设计根本就不可能封闭.编译永远都是整个系统代码. 访问者模式则提

解析C++编程中如何使用设计模式中的状态模式结构_C 语言

作用:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. UML图如下: State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为. ConcreteState类,具体状态,每一个子类实现一个与Context的一个状态相关的行为. Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把

学习php设计模式 php实现状态模式_php技巧

一.意图 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类 状态模式变化的位置在于对象的状态 二.状态模式结构图   三.状态模式中主要角色抽象状态(State)角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为 具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为 环境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例.这个具体状态类的实例给出此环境对象的现有状态四.状态