php设计模式 State (状态模式)


Posted in PHP onJune 26, 2011

状态state模式是GOF23种模式中的一种,和命令模式一样,也是一种行为模式。状态模式和命令模式相当像,一样是“接口—实现类”这种模式的应用,是面向接口编程原则的体现。

状态模式属于对象创建型模式,其意图是允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了他的类。比较常见的例子是在一个表示网络连接的类TCPConnection,一个TCPConnection对象的状态处于若干不同的状态之一:连接已经建立(Established),正在监听,连接已经关闭(closed)。当一个TCPConnection对象收到其他对象的请求时,他根据自身的状态作出不同的反应。

例如:一个Open请求的结果依赖于该连接已关闭还是连接已建立状态。State模式描述了TCPConnection如何在每一种状态下表现出不同的行为。这一种模式的关键思想是引入了一个称为TCPState的抽象类表示网络的连接状态,TCPState类为各种表示不同的操作状态的字类声明了一个公共接口。TCPState的子类实现与特定的状态相关的行为。例如,TCPEstablished和TCPClosed类分别实现了特定于TCPConnection的连接已建立状态和连接已关闭状态的行为。

举例来说:一个人具有生气,高兴和抓狂等状态,在这些状态下做同一个事情可能会有不同的结果,一个人的心情可能在这三种状态中循环转变。使用一个moodState类表示一个人的心情,使用mad,Happy,Angry类代表不同的心情。

先看一个例子:

<?php 
/** 
* 状态模式 
* 
* 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它所属的类 
* 
*/ 
interface State 
{ 
public function handle($state); 
public function display(); 
} 
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); 
} 
} 
class StateA implements State 
{ 
public function handle($context) 
{ 
$context->setState(new StateB()); 
} 
public function display() 
{ 
echo "state A<br/>"; 
} 
} 
class StateB implements State 
{ 
public function handle($context) 
{ 
$context->setState(new StateC()); 
} 
public function display() 
{ 
echo "state B<br/>"; 
} 
} 
class StateC implements State 
{ 
public function handle($context) 
{ 
$context->setState(new StateA()); 
} 
public function display() 
{ 
echo "state C<br/>"; 
} 
} 
// 实例化一下 
$objContext = new Context(new StateB()); 
$objContext->request(); 
$objContext->request(); 
$objContext->request(); 
$objContext->request(); 
$objContext->request();

状态模式的理解,关键有2点:

1. 通常命令模式的接口中只有一个方法。 而状态模式的接口中有1个或者多个方法。而且,状态模式的实现类的方法,一般返回值;或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除if…else等条件选择语句。

2. 主要的用途是,作为实例变量,是一个对象引用。命令模式的主要的使用方式是参数回调模式。命令接口作为方法的参数传递进来。然后,在方法体内回调该接口。而状态模式的主要使用方法,是作为实例变量,通过set属性方法,或者构造器把状态接口的具体实现类的实例传递进来。因此,可以这样比较命令模式和状态模式的异同。

State模式和command模式都是十分常用,粒度比较小的模式,是很多更大型模式的一部分。基本上,state模式和command模式是十分相似的。只要开发者心中对单例和多例有一个清醒的认识,即使不把它们分为两种模式也没事。

PHP 相关文章推荐
PHP小技巧搜集,每个PHPer都来露一手
Jan 02 PHP
php daodb插入、更新与删除数据
Mar 19 PHP
Php Ctemplate引擎开发相关内容
Mar 03 PHP
php实现的漂亮分页方法
Apr 17 PHP
windwos下使用php连接oracle数据库的过程分享
May 26 PHP
简单谈谈favicon
Jun 10 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
PHP实现多文件上传的方法
Jul 08 PHP
PHP中的数组处理函数实例总结
Jan 09 PHP
php指定长度分割字符串str_split函数用法示例
Jan 30 PHP
php-7.3.6 编译安装过程
Feb 11 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
Dec 29 PHP
php设计模式 Bridge (桥接模式)
Jun 26 #PHP
php设计模式 Chain Of Responsibility (职责链模式)
Jun 26 #PHP
php设计模式 FlyWeight (享元模式)
Jun 26 #PHP
php设计模式 Mediator (中介者模式)
Jun 26 #PHP
php设计模式 Prototype (原型模式)代码
Jun 26 #PHP
PHP如何解决网站大流量与高并发的问题
Jun 25 #PHP
session在PHP大型web应用中的使用
Jun 25 #PHP
You might like
php session 检测和注销
2009/03/16 PHP
PHP rawurlencode与urlencode函数的深入分析
2013/06/08 PHP
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
2014/05/10 PHP
destoon设置自定义搜索的方法
2014/06/21 PHP
php实现简单的上传进度条
2015/11/17 PHP
Thinkphp连表查询及数据导出方法示例
2016/10/15 PHP
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
jQuery入门知识简介
2010/03/04 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
基于HTML5的WebGL经典3D虚拟机房漫游动画
2017/11/15 HTML / CSS
公司中秋节活动方案
2014/02/12 职场文书
关于元旦的广播稿
2014/02/16 职场文书
考核评语大全
2014/04/29 职场文书
三严三实心得体会范文
2014/10/13 职场文书
走群众路线学习心得体会
2014/10/31 职场文书
2014年个人思想工作总结
2014/11/27 职场文书
2015感人爱情寄语
2015/02/26 职场文书
地球一小时活动总结
2015/02/27 职场文书
浅谈JS的原型和原型链
2021/06/04 Javascript
i7 6700处理器相当于i5几代
2022/04/19 数码科技