PHP设计模式——状态模式

PHP设计模式——状态模式

状态模式

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

UML类图

www.zeeklog.com  - PHP设计模式——状态模式

角色

  • 上下文环境(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 BreakState());
                $w->WriteCode();
            }
        }
    }
}

//休息状态
class BreakState implements IState
{
    public function WriteCode(Work $w)
    {
        echo "当前时间:{$w->hour}点,休息。<br/>";
    }
}

//上下文环境类
class Work
{
    public $hour;
    public $IsDone;

    private $state;

    public function __construct()
    {
        $this->SetState(new AmState());
    }

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

    public function WriteCode()
    {
        $this->state->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->hour = 19;
$emergWork->WriteCode();

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

适用场景

1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。 2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

优点

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

缺点

导致较多的ConcreteState子类

Read more

印度统治阶级锁死底层人的5大阳谋

印度统治阶级锁死底层人的5大阳谋

基于社会学和心理学视角: 1. 情感道德: 统治阶级通过塑造道德规范和情感价值观,引导底层人群的行为。例如,宣扬“勤劳致富”“忍耐美德”等观念,让底层人接受现状并自我约束。这种道德框架往往掩盖结构性不平等,使人们将个人困境归咎于自身而非系统。 2. 欲望控制: 通过消费主义和媒体宣传,统治阶级刺激底层人的物质与社会欲望(如名牌、地位),但同时设置经济壁垒,使这些欲望难以实现。底层人被困在追求“更好生活”的循环中,精力被分散,无法聚焦于挑战权力结构。 3. 情绪煽动: 利用恐惧、愤怒或民族主义等情绪,统治阶级可以通过媒体或公共事件转移底层人对社会问题的注意力。例如,制造外部敌人或内部对立(如阶层、种族矛盾),让底层人内耗而非联合反抗。 4. 暴利诱惑: 通过展示少数“成功案例”或快速致富的机会(如赌博、投机),诱导底层人追逐短期暴利。这种机制不仅让底层人陷入经济风险,还强化了对现有经济体系的依赖,削弱长期变革的可能性。 5. 权力震撼: 通过展示统治阶级的权力(

By Ne0inhk