学习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 相关文章推荐
利用递归把多维数组转为一维数组的函数
Oct 09 PHP
简单的页面缓冲技术
Oct 09 PHP
生成卡号php代码
Apr 09 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
Codeigniter实现多文件上传并创建多个缩略图
Jun 12 PHP
PHP面向对象程序设计之类常量用法实例
Aug 20 PHP
php快速排序原理与实现方法分析
May 26 PHP
[原创]php简单防盗链验证实现方法
Jul 09 PHP
PHP页面跳转操作实例分析(header方法)
Sep 28 PHP
PHP按一定比例压缩图片的方法
Oct 12 PHP
php array_chunk()函数用法与注意事项
Jul 12 PHP
phpstorm激活码2020附使用详细教程
Sep 25 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
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
PHP之数组学习
2011/05/29 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
jquery 如何动态添加、删除class样式方法介绍
2012/11/07 Javascript
js获取GridView中行数据的两种方法 分享
2013/07/13 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
JavaScript数值数组排序示例分享
2014/05/27 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
JavaScript 详解预编译原理
2017/01/22 Javascript
微信小程序分页加载的实例代码
2017/07/11 Javascript
sublime text配置node.js调试(图文教程)
2017/11/23 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
在Docker上开始部署Python应用的教程
2015/04/17 Python
python if not in 多条件判断代码
2016/09/21 Python
Python全栈之列表数据类型详解
2019/10/01 Python
Python-opencv 双线性插值实例
2020/01/17 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
python数据类型强制转换实例详解
2020/06/22 Python
Python持续监听文件变化代码实例
2020/07/22 Python
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
拉拉队口号
2014/06/16 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
超市工作总结范文2014
2014/12/19 职场文书
企业计划生育责任书
2015/05/09 职场文书
如何用Python搭建gRPC服务
2021/06/30 Python
python分分钟绘制精美地图海报
2022/02/15 Python