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
php5新改动之短标记启用方法
Sep 11 PHP
使用PHP 5.0创建图形的巧妙方法
Oct 12 PHP
php实现文件下载更能介绍
Nov 23 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
May 10 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
php判断电脑访问、手机访问的例子
May 10 PHP
Laravel框架中实现使用阿里云ACE缓存服务
Feb 10 PHP
PHP邮件群发机实现代码
Feb 16 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
Apr 02 PHP
PhpStorm配置Xdebug调试的方法步骤
Feb 02 PHP
php简单检测404页面的方法示例
Aug 23 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 读取和修改大文件的某行内容的代码
2009/10/30 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
在多个页面使用同一个HTML片段《续》
2011/03/04 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
阻止子元素继承父元素事件具体思路及实现
2013/05/02 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
jQuery焦点图轮播特效代码分享(3款)
2015/09/05 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
详解小程序如何避免多次点击,重复触发事件
2019/04/08 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
微信小程序修改数组长度的问题的解决
2019/12/17 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
详解Python爬虫的基本写法
2016/01/08 Python
python实现下载整个ftp目录的方法
2017/01/17 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
cmd运行python文件时对结果进行保存的方法
2018/05/16 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
python实现while循环打印星星的四种形状
2019/11/23 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
《悯农》教学反思
2014/04/28 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书
社区环境卫生倡议书
2015/04/29 职场文书
2016年“12.4”法制宣传日活动总结
2016/04/01 职场文书
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python
SQL Server2019数据库备份与还原脚本,数据库可批量备份
2021/11/20 SQL Server