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 相关文章推荐
Windows IIS PHP 5.2 安装与配置方法
Jun 08 PHP
php下图片文字混合水印与缩略图实现代码
Dec 11 PHP
探讨:parse url解析URL,返回其组成部分
Jun 14 PHP
PHP 解决session死锁的方法
Jun 20 PHP
对于PHP 5.4 你必须要知道的
Aug 07 PHP
PHP微信红包生成代码分享
Oct 06 PHP
php smtp实现发送邮件功能
Jun 22 PHP
PHP微信模板消息操作示例
Jun 29 PHP
php基于自定义函数记录log日志方法
Jul 21 PHP
IOS 开发之NSDictionary转换成JSON字符串
Aug 14 PHP
windows环境下使用Composer安装ThinkPHP5
May 18 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
Aug 05 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
动态新闻发布的实现及其技巧
2006/10/09 PHP
个人总结的一些关于String、Function、Array的属性和用法
2007/01/10 Javascript
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
jquery 操作css样式、位置、尺寸方法汇总
2014/11/28 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
提高Node.js性能的应用技巧分享
2017/08/10 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python对文件操作知识汇总
2016/05/15 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
Python实现去除列表中重复元素的方法总结【7种方法】
2019/02/16 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
pycharm运行scrapy过程图解
2019/11/22 Python
python 代码运行时间获取方式详解
2020/09/18 Python
下面关于"联合"的题目的输出是什么
2013/08/06 面试题
施惠特软件测试面试题以及笔试题
2015/05/13 面试题
怎样客观的做好自我评价
2013/12/28 职场文书
电工工作职责范本
2014/02/22 职场文书
公司廉洁自律承诺书
2014/03/27 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
火锅店的活动方案
2014/08/15 职场文书
个人主要事迹材料
2014/08/26 职场文书
高校教师个人总结
2015/02/10 职场文书
小升初自荐信范文
2015/03/05 职场文书
简历自荐信范文
2015/03/09 职场文书
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript