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

<?php
/**
 * 3.4 状态模式
 *  定义:
 *      当一个对象的内在状态改变时允许改变其行为,这个对象看
 *      起来像是改变了其类。
 *  角色:
 *      1. 抽象状态类
 *          职责:定义一个接口以封装与Context的一个特定状态
 *                相关的行为。
 *      2. 具体状态类
 *          职责:每一个具体的状态类实现一个与Context的一个
 *                状态相关的行为。
 *      3. Context类
 *          职责:维护一个具体状态类的实例,这个实例定义当前
 *                的状态。
 *  优点:
 *      1. 将与特定状态相关的行为局部化,并且将不同状态的行
 *         为分隔开来。
 *  缺点:
 *      1. 会增加类和对象的个数;
 *      2. 此模式的机构和实现都比较复杂,如果使用不当将导致
 *         程序结构和代码的混乱。
 * 使用场景:
 *      1. 如果一个对象的行为取决于它的状态,并且它必须在
 *         运行时,时刻根据状态改变它的行为。
 *      2. 一个操作中含有庞大的多分支条件语句,且这些分支
 *         依赖于该对象的状态。
 */

header(‘content-type:text/html;charset=utf8‘);

//抽象状态类
abstract class State{
    abstract public function handle(Context $context);
}
//具体状态类
class ConcreteStateA extends State{
    public function handle(Context $context){
        $context->setState(new ConcreteStateB());
    }
}
class ConcreteStateB extends State{
    public function handle(Context $context){
        $context->setState(new ConcreteStateC());
    }
}
class ConcreteStateC extends State{
    public function handle(Context $context){
        $context->setState(new ConcreteStateA());
    }
}
//Context类
class Context{
    private $state;
    public function __construct(State $state){
        $this->state=$state;
    }
    public function setState($state){
        $this->state=$state;
        echo ‘当前状态:‘.get_class($this->state);
    }
    public function getState(){
        return $this->state;
    }
    public function request(){
        $this->state->handle($this);
    }
}

//客户端
$context1=new Context(new ConcreteStateB());
$context1->request();
时间: 2024-08-13 14:42:32

设计模式之行为型模式—— 3.4 状态模式的相关文章

设计模式---状态变化模式之state状态模式(State)

前提:状态变化模式 在组建构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一个问题提供了一种解决方案. 典型模式 状态模式:State 备忘录模式:Memento 一:State状态模式 (一)概念 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (二)动机 在软

《JAVA与模式》之状态模式

状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 状态模式的结构 用一句话来表述,状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类.状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变.状态模式的示意性类图如下所示: 状态模式所涉及到的角色有: ● 环境(Context)角色

设计模式 ( 十八 ):State状态模式 -- 行为型

1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得“力不从心了”.随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的模式. 例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,

设计模式(行为型)之状态模式(State Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之模板方法模式(Template Method Pattern)>http://blog.csdn.net/yanbober/article/details/45501715 概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.当系统中

设计模式 ( 十七) 状态模式State(对象行为型)

1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得“力不从心了”.随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的模式. 例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,

设计模式(十九)状态模式(State)-行为型

状态模式(State)-行为型 在职责链模式中,将条件语句改成多个职责类进行处理,如果不是自己处理,则自动转到下一个职责类,如果在转给下一个职责类进行处理前,需要修改当前的状态,此时就需要用到状态模式. 引例:电梯的运行过程,各种状态切换. 实现原理图 状态模式实现原理图 状态模式就是根据对象的状态不同,作出不同的行为.状态模式使代码中复杂而庸常的逻辑判断语句问题得到了解决,而且具体状态角色将具体状态和他对应的行为封装了起来,这使得增加一种新的状态变得十分简单.状态模式主要由三部分组成,抽象状态

【设计模式】状态模式

状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象. 介绍 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类. 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为. 何时使用:代码中包含大量与对象状态有关的条件语句. 如何解决:将各种具体的状态类抽象出来. 关键代码:通常

设计模式之状态模式学习理解

在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象. 介绍 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类. 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为. 何时使用:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时. 如何解决:将各种具体的状态类

大话设计模式—状态模式

在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象. 大话设计模式中程杰老师给出的定义是,状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化.当然,如果这个状态判断很简单就没有必要使