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 相关文章推荐
第十四节--命名空间
Nov 16 PHP
提高define性能的php扩展hidef的安装和使用
Jun 14 PHP
php实现用户在线时间统计详解
Oct 08 PHP
Memcached常用命令以及使用说明详解
Jun 27 PHP
PHP添加Xdebug扩展的方法
Feb 12 PHP
php实现文件编码批量转换
Mar 10 PHP
ThinkPHP3.2.2的插件控制器功能
Mar 05 PHP
php简单获取目录列表的方法
Mar 24 PHP
PHP树-不需要递归的实现方法
Jun 21 PHP
Smarty日期时间操作方法示例
Nov 15 PHP
PHP多种序列化/反序列化的方法详解
Jun 23 PHP
浅谈laravel中的关联查询with的问题
Oct 10 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
PHP中改变图片的尺寸大小的代码
2011/07/17 PHP
php添加文章时生成静态HTML文章的实现代码
2013/02/17 PHP
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
2013/06/17 PHP
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
php5.3提示Function ereg() is deprecated Error问题解决方法
2014/11/12 PHP
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
javascript中全局对象的parseInt()方法使用介绍
2013/12/19 Javascript
jquery中的$(document).ready()使用小结
2014/02/14 Javascript
JS通过ajax动态读取xml文件内容的方法
2015/03/24 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
jQuery实现滚动效果
2017/11/17 jQuery
详解Angular5 服务端渲染实战
2018/01/04 Javascript
深入理解Vue router的部分高级用法
2018/08/15 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
微信小程序 自定义弹窗实现过程(附代码)
2019/12/05 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
python查找第k小元素代码分享
2013/12/18 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
销售代表求职自荐信
2013/10/01 职场文书
护士自荐信怎么写
2013/10/18 职场文书
业务代表的岗位职责
2013/11/16 职场文书
自荐信封面
2013/12/04 职场文书
运动会广播稿30字
2014/01/21 职场文书
法院信息化建设方案
2014/05/21 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python
一条慢SQL语句引发的改造之路
2022/03/16 MySQL