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源代码
Oct 09 PHP
php url地址栏传中文乱码解决方法集合
Jun 25 PHP
php文件操作实例代码
May 10 PHP
php实例分享之二维数组排序
May 15 PHP
php实现兼容2038年后Unix时间戳转换函数
Mar 18 PHP
php获取文件类型和文件信息的方法
Jul 10 PHP
twig模板常用语句实例小结
Feb 04 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
Jun 30 PHP
微信公众号模板消息群发php代码示例
Dec 29 PHP
PHP实现对xml的增删改查操作案例分析
May 19 PHP
Laravel 创建指定表 migrate的例子
Oct 09 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 Smarty初体验二 获取配置信息
2011/08/08 PHP
php+xml编程之xpath的应用实例
2015/01/24 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
总结JavaScript设计模式编程中的享元模式使用
2016/05/21 Javascript
Bootstrap学习笔记之js组件(4)
2016/06/12 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
原生js实现Flappy Bird小游戏
2018/12/24 Javascript
jQuery+ajax实现批量删除功能完整示例
2019/06/06 jQuery
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
python将人民币转换大写的脚本代码
2013/02/10 Python
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
python逆向入门教程
2018/01/15 Python
解决python selenium3启动不了firefox的问题
2018/10/13 Python
Python函数装饰器常见使用方法实例详解
2019/03/30 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
Python类反射机制使用实例解析
2019/12/30 Python
在python中实现求输出1-3+5-7+9-......101的和
2020/04/02 Python
浅析Python 责任链设计模式
2020/09/11 Python
Python猫眼电影最近上映的电影票房信息
2020/09/18 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
解决HTML5手机端页面缩放的问题
2017/10/27 HTML / CSS
C#笔试题集合
2013/06/21 面试题
有针对性的求职自荐信
2013/11/14 职场文书
小学母亲节活动方案
2014/03/14 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
课外小组活动总结
2014/08/27 职场文书
导游词之藏龙百瀑景区
2019/12/30 职场文书
Python数据分析之绘图和可视化详解
2021/06/02 Python