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 相关文章推荐
PHP4与PHP5的时间格式问题
Feb 17 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
Jun 25 PHP
Codeigniter购物车类不能添加中文的解决方法
Nov 29 PHP
php静态文件返回304技巧分享
Jan 06 PHP
php字符串替换函数substr_replace()用法实例
Mar 17 PHP
PHP数组生成XML格式数据的封装类实例
Nov 10 PHP
php实现PDO中捕获SQL语句错误的方法
Feb 16 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
Mar 10 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
Jun 08 PHP
PHP有序表查找之插值查找算法示例
Feb 10 PHP
php JWT在web端中的使用方法教程
Sep 06 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
May 15 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
怎么在Windows系统中搭建php环境
2013/08/31 PHP
php常用字符函数实例小结
2016/12/29 PHP
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
基于JS实现PHP的sprintf函数实例
2015/11/14 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
2017/01/06 Javascript
package.json文件配置详解
2017/06/15 Javascript
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
JS实现简易日历效果
2021/01/25 Javascript
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
python获取当前计算机cpu数量的方法
2015/04/18 Python
Ubuntu下安装PyV8
2016/03/13 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
python对文件的操作方法汇总
2020/02/28 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
介绍一些UNIX常用简单命令
2014/11/11 面试题
升职自荐信
2013/11/28 职场文书
爱心倡议书范文
2014/05/12 职场文书
低碳环保标语
2014/06/12 职场文书
关于读书的活动方案
2014/08/14 职场文书
应聘教师自荐信
2015/03/26 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
父母教会我观后感
2015/06/17 职场文书
公司食堂管理制度
2015/08/05 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript