服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - PHP教程 - php设计模式 State (状态模式)

php设计模式 State (状态模式)

2019-12-01 12:40PHP教程网 PHP教程

允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它所属的类

状态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封装CURL

    浅谈PHP封装CURL

    这篇文章主要介绍了PHP如何封装CURL,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

    小狗最阳光1682019-06-05
  • PHP教程PHP赋值的内部是如何跑的详解

    PHP赋值的内部是如何跑的详解

    这篇文章主要给大家介绍了关于PHP赋值的内部是如何跑的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    写PHP的老王2662019-07-03
  • PHP教程PHP children()函数讲解

    PHP children()函数讲解

    今天小编就为大家分享一篇关于PHP children()函数讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    php参考手册4032019-06-23
  • PHP教程ThinkPHP框架中使用Memcached缓存数据的方法

    ThinkPHP框架中使用Memcached缓存数据的方法

    这篇文章主要介绍了ThinkPHP框架中使用Memcached缓存数据的方法,结合实例形式分析了thinkPHP框架中Memcached缓存的设置与使用相关操作技巧,需要的朋友可以参考...

    SohoWang2522019-10-14
  • PHP教程php利用ob_start()清除输出和选择性输出的方法

    php利用ob_start()清除输出和选择性输出的方法

    下面小编就为大家分享一篇php利用ob_start()清除输出和选择性输出的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    恁金峰兄5092019-10-25
  • PHP教程实例讲解通过​PHP创建数据库

    实例讲解通过​PHP创建数据库

    在本篇文章里小编给大家分享了关于如何通过​PHP创建数据库的知识点内容,有需要的朋友们学习下。...

    laozhang3442019-06-30
  • PHP教程php-fpm添加service服务的例子

    php-fpm添加service服务的例子

    这篇文章主要介绍了php-fpm添加service服务的例子,需要的朋友可以参考下 ...

    无喱头的菜园子1712019-10-10
  • PHP教程PHPExcel实现表格导出功能示例【带有多个工作sheet】

    PHPExcel实现表格导出功能示例【带有多个工作sheet】

    这篇文章主要介绍了PHPExcel实现表格导出功能,结合实例形式分析了PHPExcel针对带有多个工作sheet的表格导出相关操作实现技巧,需要的朋友可以参考下 ...

    wensongyu1352019-09-25