PHP设计模式笔记:使用PHP实现状态模式

By | 03月05日
Advertisement

【意图】
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类
状态模式变化的位置在于对象的状态

【状态模式结构图】

PHP设计模式笔记:使用PHP实现状态模式


状态模式

【状态模式中主要角色】
抽象状态(State)角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为
具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为
环境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态

【状态模式的优点和缺点】
1、它将与特定状态相关的行为局部化
2、它使得状态转换显示化
3、State对象可被共享

【状态模式适用场景】
1、一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为
2、一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式模式将每一个条件分支放入一个独立的类中。这使得你可以要所对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化

【状态模式与其它模式】
单例模式(singleton模式):具体状态对象通常是单例模式
享元模式(flyweight模式):享元模式解释了何时以及怎样共享状态对象

【状态模式PHP示例】

<?php     /**   * 状态模式的PHP简单实现
*/     /**   * 抽象状态角色   */  interface State {         /**       * 方法示例       */      public function handle(Context $context);  }     /**   * 具体状态角色A   * 单例类   */  class ConcreteStateA implements State {      /* 唯一的实例 */      private static $_instance = null;         private function __construct() {         }         /**       * 静态工厂方法,返还此类的唯一实例       */      public static function getInstance() {          if (is_null(self::$_instance)) {              self::$_instance = new ConcreteStateA();          }             return self::$_instance;      }         public function handle(Context $context) {          echo 'Concrete Sate A handle method<br />';          $context->setState(ConcreteStateB::getInstance());      }     }     /**   * 具体状态角色B   * 单例类   */  class ConcreteStateB implements State {      /* 唯一的实例 */         private static $_instance = null;         private function __construct() {      }         /**       * 静态工厂方法,返还此类的唯一实例       */      public static function getInstance() {          if (is_null(self::$_instance)) {              self::$_instance = new ConcreteStateB();          }             return self::$_instance;      }         public function handle(Context $context) {          echo 'Concrete Sate B handle method<br />';          $context->setState(ConcreteStateA::getInstance());      }     }     /**   * 环境角色   */  class Context {         private $_state;         /**       * 默认为StateA       */      public function __construct() {          $this->_state = ConcreteStateA::getInstance();      }         public function setState(State $state) {          $this->_state = $state;      }         public function request() {          $this->_state->handle($this);      }     }       $context = new Context(); $context->request();        $context->request();        $context->request();        $context->request();?>

Similar Posts:

  • Java设计模式之二十三(状态模式)

    一.什么是状态模式 State模式也叫状态模式,是行为设计模式的一种.State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样. 二.状态模式的应用场景 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转译到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化. 三.状态模式的结构 四.状态模式的角色和职责 Context:用户对象拥有一个State类型的成员,以标识对象的当前状态: State:接口或基类封装与Con

  • C++设计模式之二十--State状态模式

    转自:http://www.cnblogs.com/wanggary/archive/2011/04/21/2024117.html 概念:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. main(),客户 CLiftState,电梯状态抽象类 CCloseingState,电梯门关闭 COpenningState,电梯门打开 CRunningState,电梯运行 CStoppingState,电梯停止 CContext,电梯的控制面板 说明:CContext保持电梯的

  • 设计模式笔记十九:备忘录模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 备忘录模式(Memento Pattern)(本文大部分摘自原文) 保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 意图: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 主要解决: 所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的

  • 设计模式笔记(五) —— 代理模式

     代理模式(Proxy):为其它对角提供一种代理以控制对这个对象的访问.   使用场合有以下几种:   第一:远程代理,也就是为一个对象在不同的地址空间提供局部代表.这样可以隐藏一个存在不同地址空间的事实.(WebService)   第二:虚拟代理,是根据需要创建开销很大的对象.通过它来存放实例化需要很长时间的对象.   第三:安全代理,用来控制真实对象的访问权限.   第四:智能指引,是指调用真实的对象时,代理处理另外一些事. using System; namespace StuDesig

  • 设计模式笔记(八)--迭代器模式、组合模式

    迭代器模式(Iterator Pattern) 提供一个方法顺序访问一个聚合对象中的元素,而不暴露其内部的表示. 简单点说,Java集合框架中的集合:ArrayList.LinkedList.Vector.Stack.HashMap.HashTable等容器,还有对象数组,要想遍历出里面的所有对象基本每个容器有每个容器的遍历方式,现在我们想不管用什么容器存储这些对象,我都用相同的方式进行遍历.因此,我们需要封装"遍历集合内每个对象的过程",这个迭代器接口需要有hasNext()方法判断

  • 设计模式笔记之十一 (享元模式)

    享元模式 享元模式的英文说法是:Flyweight Parrern, 又被译作蝇量模式.这两种译法分别说明了其需要解决的问题,解决问题的方式: 当我们需要解决许多轻量类引起的资源开销问题的时候(蝇量模式),我们可以用重用共同点的元素(享元模式)的方法来解决. 正如我们实验室最近接到的一个订单的最终解决方案一样. 前段时间我们的太阳市场部得到一笔大订单:太阳国某富豪要举办一场盛大的聚会,他们需要订购一批女人来满足他的客人们: class NvRen { private String name; p

  • headFirst学习笔记之十:状态模式(5.2)

    1.如何从状态图得到真正的代码: (1)找出所有状态:没有25分钱,有25分钱,糖果售罄,售出糖果. (2)创建一个实例变量来持有目前状态,并且定义每个状态的值: 1 final static int SOLD_OUT = 0; 2 final static int NO_QUARTER = 1; 3 final static int HAS_QUARTER = 2; 4 final static int SOLD = 3; 5 6 int state = SOLD_OUT; (3)找出所有的动

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

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

  • HeadFirst 设计模式学习笔记11——状态模式

    本文已搬家至[HeadFirst 设计模式学习笔记]11 状态模式

  • 设计模式笔记:状态模式&amp;策略模式

    这几天一直在忙期末考和实训,写笔记的时间也没有多少,不说废话了: 这文主要写两种模式:状态跟策略,主要是因为他们的类图一样,并且比较简单,写在同一篇文章里面容易甄别 状态模式:允许对象在内部状态改变时改变他的行为,对象看起来好像修改了他的类 先保留概念的意思,在平常的编程中,如果需要不同的状态,很一般的做法是在你要操作的类里面定义不同的常量代表不同的状态,然后if-else依据不同的状态有不同的实现: 1.你可以想象大量的if-else语句造成的低可读性和低效率 2.其次是你修改这个类的时候很麻

  • 《Head First设计模式》 读书笔记11 状态模式 The State Pattern

    <Head First设计模式> 读书笔记11 状态模式 The State Pattern 问题引入 本章的实例问题是一个糖果机的控制器,有几个状态,不同的动作会有不同的响应. 比如投币再转动曲柄,会发放糖果,糖果没有了会显示售罄等等. 第一版的程序 下面是一个从状态图实现状态机代码(state machine)的简单介绍: 1.首先,找出所有的状态. 2.接下来,创建一个实例变量来持有目前的状态,然后定义每个状态的值. 3.之后,将系统中所有可以发生的动作整合起来. 4.创建类代码,对每一

Tags: