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 相关文章推荐
phpMyAdmin2.11.6安装配置方法
Aug 24 PHP
php strtotime 函数UNIX时间戳
Jan 14 PHP
PHP迭代器实现斐波纳契数列的函数
Nov 12 PHP
php使用PDO方法详解
Dec 27 PHP
php绘制一个扇形的方法
Jan 24 PHP
php数组添加与删除单元的常用函数实例分析
Feb 16 PHP
PHP实现QQ快速登录的方法
Sep 28 PHP
PHP实现的一致性Hash算法详解【分布式算法】
Mar 31 PHP
thinkphp5引入公共部分header、footer的方法详解
Sep 14 PHP
PHP+Ajax实现的检测用户名功能简单示例
Feb 12 PHP
PHP常用函数之根据生日计算年龄功能示例
Oct 21 PHP
一文搞懂php的垃圾回收机制
Jun 18 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中使用全局变量的几种方法
2013/06/24 PHP
php多维数组去掉重复值示例分享
2014/03/02 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
PHP调用接口API封装的例子
2019/10/11 PHP
javascript 的Document属性和方法集合
2010/01/25 Javascript
Document对象内容集合(比较全)
2010/09/06 Javascript
JavaScript定义类或函数的几种方式小结
2011/01/09 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
2013/08/06 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
JS获取及验证开始结束日期的方法
2016/08/20 Javascript
Bootstrap组合上、下拉框简单实现代码
2017/03/06 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
django 删除数据库表后重新同步的方法
2018/05/27 Python
django使用LDAP验证的方法示例
2018/12/10 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
python实现简单五子棋游戏
2019/06/18 Python
python中比较两个列表的实例方法
2019/07/04 Python
使用python制作一个解压缩软件
2019/11/13 Python
Python类及获取对象属性方法解析
2020/06/15 Python
html5服务器推送_动力节点Java学院整理
2017/07/12 HTML / CSS
德国拖鞋网站:German Slippers
2019/11/08 全球购物
总监职责范文
2013/11/09 职场文书
采购部岗位职责
2013/11/24 职场文书
公司新年寄语
2014/04/04 职场文书
创业女性典型材料
2014/05/02 职场文书
企业形象策划方案
2014/05/29 职场文书
党的群众路线教育实践活动心得体会(乡镇)
2014/11/03 职场文书
2015年端午节活动总结
2015/02/11 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
MySQL基础(一)
2021/04/05 MySQL
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫