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 图片上传实现代码 带详细注释
Apr 29 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
Nov 19 PHP
php 伪造ip以及url来路信息方法汇总
Nov 25 PHP
php编程每天必学之验证码
Mar 03 PHP
Symfony2框架学习笔记之表单用法详解
Mar 18 PHP
PHP删除数组中指定下标的元素方法
Feb 03 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
php获得刚插入数据的id 的几种方法总结
May 31 PHP
PHP时间戳和日期相互转换操作实例小结
Dec 18 PHP
PHP echo()函数讲解
Feb 15 PHP
PHP实现的杨辉三角求解算法分析
Mar 11 PHP
PHP vsprintf()函数格式化字符串操作原理解析
Jul 14 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
PHP4与PHP5的时间格式问题
2008/02/17 PHP
ubuntu10.04配置 nginx+php-fpm模式的详解
2013/06/03 PHP
PHP函数microtime()用法与说明
2013/12/04 PHP
PHP中使用php://input处理相同name值的表单数据
2015/02/03 PHP
yii添删改查实例
2015/11/16 PHP
Laravel日志用法详解
2016/10/09 PHP
SWFObject Flash js调用类
2008/07/08 Javascript
JQuery优缺点分析说明
2010/06/09 Javascript
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
原生javascript和jquery判断浏览器版本等信息
2013/07/04 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
基于JavaScript实现智能右键菜单
2016/03/02 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
Vue核心概念Getter的使用方法
2019/01/18 Javascript
用js编写留言板
2020/03/17 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
python实现360皮肤按钮控件示例
2014/02/21 Python
python开启多个子进程并行运行的方法
2015/04/18 Python
Python简单实现控制电脑的方法
2018/01/22 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
linux环境下安装python虚拟环境及注意事项
2020/01/07 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
python能自学吗
2020/06/18 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
新东网科技Java笔试题
2012/07/13 面试题
毕业生个人求职的自我评价
2013/10/28 职场文书
暑期教师培训方案
2014/06/07 职场文书
公安机关纪律作风整顿剖析
2014/10/10 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书