状态模式的另一种写法

<?php
/**
 * 状态模式
 * 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它所属的类
 */

/*接口*/
interface State
{
    public function handle($state);//切换到下一个状态
    public function display();//显示当前状态
}

/*状态A*/
class StateA implements State
{
    public function handle($context)
    {
        $context->setState(new StateB());
    }

    public function display()
    {
        echo "state A<br />";
    }
}
/*状态B*/
class StateB implements State
{
    public function handle($context)
    {
        $context->setState(new StateC());
    }

    public function display()
    {
        echo "state B<br/>";
    }
}
/*状态C*/
class StateC implements State
{
    public function handle($context)
    {
        $context->setState(new StateA());
    }

    public function display()
    {
        echo "state C<br/>";
    }
}

class Context
{
    private $_state = null;
    public function __construct($state)//给初始状态
    {
        $this->setState($state);
    }

    public function setState($state)//设置状态的函数
    {
        $this->_state = $state;
    }

    public function request()//执行显示状态并切换状态
    {
        $this->_state->display();
        $this->_state->handle($this);
    }
}

// 实例化一下
$objContext = new Context(new StateB());
$objContext->request();
$objContext->request();
$objContext->request();
$objContext->request();
$objContext->request();
?>
时间: 2024-12-01 08:27:14

状态模式的另一种写法的相关文章

Java状态模式(State模式)

State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了. 不只是根据状态,也有根据属性.如果某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比较高,我们经常会在一个数据表的尾部,加上property属性含义的字段,用以标识记录中一些特殊

设计模式之行为型状态模式

当一个对象内部状态发生改变时,会导致其行为的改变,这看起来像是改变了对像.平时写代码的时候经常会遇到要写很多条件判断语句的情况,那么怎么减少代码中的条件判断语句呢?对于这类分支条件内部独立结果的管理,可以使用状态模式,每一种条件作为对象的一种状态,面对不同的判断结果,其实就是选择对象内的一种状态. // 投票结果状态对象 var ResultState = function() { // 判断结果保存在内部状态中 var States = { // 每种状态作为一种独立方法保存 state0:

设计模式学习笔记(十七:状态模式)

1.1概述 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类.这就是状态模式的定义. 一个对象的状态依赖于它的变量的取值情况,对象在不同的运行环境中,可能具有不同的状态.在许多情况下,对象调用方法所产生的行为效果依赖于它当时的状态. 例如,一个温度计(Thermometer)类的实例:温度计类通过调用方法showMessage()显示有关信息时,需要根据当前自己温度(temperature)变量的值来显示有关信息,即根据自己的状态来决定showMessage()方法所体现的

23种状态模式的理解

总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代器模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 工厂方法模式 首先,良好的封装性,代码结构清晰.一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名就可以

二十三种设计模式[20] - 状态模式(State Pattern)

前言 状态模式,对象行为型模式的一种.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类 ". 场景 我们都坐过火车,火车可以简单的分为" 开门 "," 关门 "," 运行 "," 停止 "四个状态.火车在这四个状态下分别可以做不同的事情.比如只有在关门时才行运行.只有在停止时才能开门. 我们在开发类似的业务时,往

七种写法的单列模式

目录 七种写法的单列模式 版本1:饿汉式 版本2:多线程可能导致多个实例 版本3:效率有待优化 版本4:Double Check可能出现空指针异常 版本5:Double Check 版本6:通过静态内部类构造 版本7:通过枚举构造 七种写法的单列模式 版本1:饿汉式 public class SingletonObject1 { private static final SingletonObject1 instance = new SingletonObject1(); private Sin

两种语言实现设计模式(C++和Java)(十六:状态模式)

状态模式对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为. 状态模式是一种对象行为型模式,其主要优点如下. 状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”. 减少对象间的相互依赖.将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖. 有利于程序的扩展.通过定义新的子类很容易地增加新的状态和转换. 状态模式的主要缺点如下. 状态模式的使用必然会增加系统的类与对象

23种设计模式之状态模式

状态模式(State):当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类. package designMode.state; class Context { private State state; public Context(State state) { this.state = state; } /** * 对请求做处理,并设置下一状态 */ public void request(){ state.handle(this); } /***************

24种设计模式--状态模式【State Pattern】

现在城市发展很快,百万级人口的城市一堆一堆的,那其中有两个东西的发明在城市的发展中起到非常重要的作用:一个是汽车,一个呢是...,猜猜看,是什么?是电梯!汽车让城市可以横向扩展,电梯让城市可以纵向延伸,向空中伸展.汽车对城市的发展我们就不说了,电梯,你想想看,如果没有电梯,每天你需要爬 10 层楼梯, 你是不是会崩溃掉?建筑师设计了一个没有电梯的建筑,那投资家肯定不愿意投资,那也是建筑师的耻辱呀,今天我们就用程序表现一下这个电梯是怎么运作的. 我们每天都在乘电梯,那我们来看看电梯有哪些动作(映射