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面向对象全攻略 (十五) 多态的应用
Sep 30 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
Feb 05 PHP
Yii把CGridView文本框换成下拉框的方法
Dec 03 PHP
浅谈php冒泡排序
Dec 30 PHP
php curl 获取https请求的2种方法
Apr 27 PHP
php用户登录之cookie信息安全分析
May 13 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
thinkphp分页集成实例
Jul 24 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
Apr 27 PHP
php从数据库读取数据,并以json格式返回数据的方法
Aug 21 PHP
laravel 框架配置404等异常页面
Jan 07 PHP
php5与php7的区别点总结
Oct 11 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
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
php-fpm开启状态统计的方法详解
2017/06/23 PHP
php模式设计之观察者模式应用实例分析
2019/09/25 PHP
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
JS箭头函数和常规函数之间的区别实例分析【 5 个区别】
2020/05/27 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
[01:23]一分钟告诉你 DOTA2为什么叫信仰2
2014/06/20 DOTA
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
Python正则表达式的使用范例详解
2014/08/08 Python
在Python的Django框架中simple-todo工具的简单使用
2015/05/30 Python
python实现报表自动化详解
2017/11/16 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
python图像和办公文档处理总结
2019/05/28 Python
python自带tkinter库实现棋盘覆盖图形界面
2019/07/17 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
python opencv 实现读取、显示、写入图像的方法
2020/06/08 Python
CSS3 calc()会计算属性详解
2018/02/27 HTML / CSS
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
最新茶叶店创业计划书
2014/01/14 职场文书
毕业生大学生活自我总结
2014/01/31 职场文书
优秀少先队大队辅导员事迹材料
2014/05/04 职场文书
技术员岗位职责范本
2015/04/11 职场文书
计划生育目标责任书
2015/05/09 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书
初中体育课教学反思
2016/02/16 职场文书
详解MySQL中的主键与事务
2021/05/27 MySQL
Python循环之while无限迭代
2022/04/30 Python