学习php设计模式 php实现状态模式


Posted in PHP onDecember 07, 2015

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

二、状态模式结构图

学习php设计模式 php实现状态模式 

三、状态模式中主要角色
抽象状态(State)角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为
具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为
环境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态
四、状态模式的优点和缺点
1、它将与特定状态相关的行为局部化
2、它使得状态转换显示化
3、State对象可被共享
五、状态模式适用场景
1、一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为
2、一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式模式将每一个条件分支放入一个独立的类中。这使得你可以要所对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化
六、状态模式与其它模式
单例模式(singleton模式):具体状态对象通常是单例模式
享元模式(flyweight模式):享元模式解释了何时以及怎样共享状态对象
七、状态模式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);
  }
 
}
 
/**
 * 客户端
 */
class Client {
 
  /**
   * Main program.
   */
  public static function main() {
    $context = new Context();
    $context->request();
    $context->request();
    $context->request();
    $context->request();
  }
 
}
 
Client::main();
?>

以上就是使用php实现状态模式的代码,还有一些关于状态模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
PHP新手上路(二)
Oct 09 PHP
让PHP开发者事半功倍的十大技巧小结
Apr 20 PHP
从手册去理解分析PHP session机制
Jul 17 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
Jul 02 PHP
PHP setTime 设置当前时间的代码
Aug 27 PHP
探讨如何在php168_cms中提取验证码
Jun 08 PHP
php绘图之加载外部图片的方法
Jan 24 PHP
PHP仿微信发红包领红包效果
Oct 30 PHP
PHP实现读取文件夹及批量重命名文件操作示例
Apr 15 PHP
php curl操作API接口类完整示例
May 21 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
Jun 25 PHP
PHP7 错误处理机制修改
Mar 09 PHP
学习php设计模式 php实现适配器模式
Dec 07 #PHP
分享五个PHP7性能优化提升技巧
Dec 07 #PHP
学习php设计模式 php实现工厂模式(factory)
Dec 07 #PHP
学习php设计模式 php实现原型模式(prototype)
Dec 07 #PHP
PHP中Enum(枚举)用法实例详解
Dec 07 #PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 #PHP
学习php设计模式 php实现门面模式(Facade)
Dec 07 #PHP
You might like
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
2009/03/03 PHP
用php或asp创建网页桌面快捷方式的代码
2010/03/23 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
php从给定url获取文件扩展名的方法
2015/03/14 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
Javascript 页面模板化很多人没有使用过的方法
2012/06/05 Javascript
关于jquery css的使用介绍
2013/04/18 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
javascript 兼容各个浏览器的事件
2015/02/04 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
JS实现json的序列化和反序列化功能示例
2017/06/13 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
基于Require.js使用方法(总结)
2017/10/26 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
Python Print实现在输出中插入变量的例子
2019/12/25 Python
django使用graphql的实例
2020/09/02 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
2014年健康教育实施方案
2014/02/17 职场文书
先进集体事迹材料
2014/02/17 职场文书
征兵宣传标语
2014/06/20 职场文书
小学生通知书评语
2014/12/31 职场文书
党员转正申请报告
2015/05/15 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书
Nginx 负载均衡是什么以及该如何配置
2021/03/31 Servers
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
漫画「狩龙人拉格纳」公开TV动画预告图
2022/03/22 日漫