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设计模式 Decorator(装饰模式)
Jun 26 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
php导入导出excel实例
Oct 25 PHP
成为好程序员必须避免的5个坏习惯
Jul 04 PHP
推荐25款php中非常有用的类库
Sep 29 PHP
使用PHP similar text计算两个字符串相似度
Nov 06 PHP
php array_multisort 对数组进行排序详解及实例代码
Oct 27 PHP
smarty模板数学运算示例
Dec 11 PHP
PHP实现按之字形顺序打印二叉树的方法
Jan 16 PHP
PHP抽象类与接口的区别详解
Mar 21 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
Oct 12 PHP
Laravel框架Eloquent ORM删除数据操作示例
Dec 03 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
PHP读取MySQL数据代码
2008/06/05 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
laravel 实现根据字段不同值做不同查询
2019/10/23 PHP
JavaScript实现动态增加文件域表单
2009/02/12 Javascript
javascript 中String.match()与RegExp.exec()的区别说明
2013/01/10 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
javascript加号&quot;+&quot;的二义性说明
2013/03/04 Javascript
js使用eval解析json(js中使用json)
2014/01/17 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
2016/07/09 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
Vue.js实现的表格增加删除demo示例
2018/05/22 Javascript
浅谈vue在html中出现{{}}的原因及解决方式
2020/11/16 Javascript
[01:00:14]DOTA2官方TI8总决赛纪录片 真视界True Sight
2019/01/16 DOTA
[01:52]2020年DOTA2 TI10夏季活动预告片
2020/07/15 DOTA
Python中请使用isinstance()判断变量类型
2014/08/25 Python
Python随机生成彩票号码的方法
2015/03/05 Python
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
Python实现调度算法代码详解
2017/12/01 Python
深入了解python中元类的相关知识
2019/08/29 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
2020/03/09 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
什么是表空间(tablespace)和系统表空间(System tablespace)
2013/02/25 面试题
孝老爱亲模范事迹
2014/01/24 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
企业指导教师评语
2014/04/28 职场文书
介绍信怎么写
2015/01/30 职场文书