美文网首页设计模式
设计模式 状态模式

设计模式 状态模式

作者: Yohann丶blog | 来源:发表于2020-06-22 15:06 被阅读0次
WechatIMG11.jpeg

介绍

shiyanlou:状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。有时,一个对象的行为受其一个或多个具体的属性变化而变化,这样的属性也叫作状态,这样的的对象也叫作有状态的对象。

角色

角色 说明
Context 环境类,维护一个 ConcreteState 子类的实例,这个实例定义当前状态
State 抽象状态类,定义一个接口以封装与 Context 的一个特定状态相关的行为
ConcreteState 具体状态类,每一个子类实现一个与 Context 的一个状态相关的行为

角色示例

类名 担任角色 说明
Vip Context 会员类
Level State 会员等级类
Level1 ConcreteState 等级一
Level2 ConcreteState 等级二
Level3 ConcreteState 等级三

UML类图

状态模式.png

代码

<?php 
class Vip{
    protected $level;

    protected static $money = 0;

    function __construct()
    {
        $this->level = Level1::getInstance();
    }

    public function changeLevel()
    {
        $money = $this->money;
        switch ($money) {
            case  ($money >= 0 && $money < 5):
                $this->level = Level1::getInstance();
                break;
            case  ($money >= 5 && $money < 10):
                $this->level = Level2::getInstance();
                break;
            case  ($money >= 10):
                $this->level = Level3::getInstance();
                break;
        }
        return '变更'.get_class($this->level).PHP_EOL;
    }

    public function deposit($money)
    {
        $this->money += $money;
        return '充值'.$money.',余额'.$this->money.','.$this->level->check($this);
    }
}

abstract class Level{

    abstract function check(Vip $vip);

}


class Level1 extends Level
{
    private static $instance;

    private function __construct(){}

    private function __clone(){}

    public static function getInstance()
    {
        if (!isset(self::$instance)) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    public function check(Vip $vip)
    {
        return $vip->changeLevel();
    }
}

class Level2 extends Level
{
    private static $instance;

    private function __construct(){}

    private function __clone(){}

    public static function getInstance()
    {
        if (!isset(self::$instance)) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    public function check(Vip $vip)
    {
        return $vip->changeLevel();
    }
}

class Level3 extends Level
{
    private static $instance;

    private function __construct(){}

    private function __clone(){}

    public static function getInstance()
    {
        if (!isset(self::$instance)) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    public function check(Vip $vip)
    {
        return $vip->changeLevel();
    }
}

$vip = new Vip();
echo $vip->deposit(3);
echo $vip->deposit(6);
echo $vip->deposit(9);

创建 Vip.php,内容如上。

执行

$ php Vip.php
充值3,余额3,变更Level1
充值6,余额9,变更Level2
充值9,余额18,变更Level3

相关文章

  • 设计模式-状态模式

    设计模式-状态模式 设计模式 状态模式的关键是区分事物内部的状态

  • 设计模式——状态模式

    设计模式——状态模式 在状态模式中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 优点: 减少...

  • 设计模式-状态设计模式

    1.定义 对于某个操作,由于其状态的不同,表现出的行为会不同(如遥控器进行音量增加的操作,在电视是开机状态下是可以...

  • 设计模式——状态模式

    前言 设计模式是指导一个程序猿以更好的姿态处理一些问题,而不再像刚学编程的我们,只会使用if-else分支语句,或...

  • 设计模式--状态模式

    基本常识:策略模式与状态模式是双胞胎,在出生时才分开。 假设公司有个糖果机,1当糖果机由糖果,投入25分钱,转动曲...

  • 设计模式——状态模式

    在阎宏博士的《JAVA与模式》一书中开头是这样描述状态(State)模式的:状态模式,又称状态对象模式(Patte...

  • 设计模式《状态模式》

    引言   上一节我们说了策略模式。这一节我们讲讲策略模式的双胞胎弟弟:状态模式,这个模式大家可能不常见,也不常用,...

  • 设计模式——状态模式

    定义 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行...

  • 设计模式 - 状态模式

    模式定义 允许一个对象在其内部状态发生改变时改变它的行为。对象看起来似乎修改了它的类。 状态模式(State Pa...

  • 设计模式 ——— 状态模式

    STATE(状态) ———— 对象行为型模式 意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改...

网友评论

    本文标题:设计模式 状态模式

    本文链接:https://www.haomeiwen.com/subject/wmwxfktx.html