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 相关文章推荐
第十四节 命名空间 [14]
Oct 09 PHP
汉字转化为拼音(php版)
Oct 09 PHP
用mysql触发器自动更新memcache的实现代码
Oct 11 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
Jun 27 PHP
codeigniter框架批量插入数据
Jan 09 PHP
php中ftp_chdir与ftp_cdup函数用法
Nov 18 PHP
PHP查找与搜索数组元素方法总结
Jun 12 PHP
PHP中模拟链表和链表的基本操作示例
Feb 27 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 PHP
抛弃 PHP 代价太高
Apr 26 PHP
PHP页面输出时js设置input框的选中值
Sep 30 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 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
咖啡的传说和历史
2021/03/03 新手入门
php代码运行时间查看类代码分享
2011/08/06 PHP
基于php socket(fsockopen)的应用实例分析
2013/06/02 PHP
sae使用smarty模板的方法
2013/12/17 PHP
PHP异常处理浅析
2015/05/12 PHP
PHP 生成微信红包代码简单
2016/03/25 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
利用json获取字符出现次数的代码
2012/03/22 Javascript
页面载入结束自动调用js函数示例
2013/09/23 Javascript
调用innerHTML之后onclick失效问题的解决方法
2014/01/28 Javascript
Javascript基础知识(一)核心基础语法与事件模型
2014/09/29 Javascript
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
Python脚本实现代码行数统计代码分享
2015/03/10 Python
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
django如何通过类视图使用装饰器
2019/07/24 Python
python 循环数据赋值实例
2019/12/02 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
ASOS亚洲:ASOS Asia
2018/03/04 全球购物
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
岗位说明书标准范本
2014/07/30 职场文书
预备党员群众路线思想汇报2014
2014/10/25 职场文书
初中作文评语集锦
2014/12/25 职场文书
以权谋私检举信范文
2015/03/02 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL