学习php设计模式 php实现状态模式


Posted in PHP onDecember 07, 2015

一、意图
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类
状态模式变化的位置在于对象的状态

二、状态模式结构图

学习php设计模式 php实现状态模式 

三、状态模式中主要角色
抽象状态(State)角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为
具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为
环境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态
四、状态模式的优点和缺点
1、它将与特定状态相关的行为局部化
2、它使得状态转换显示化
3、State对象可被共享
五、状态模式适用场景
1、一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为
2、一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式模式将每一个条件分支放入一个独立的类中。这使得你可以要所对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化
六、状态模式与其它模式
单例模式(singleton模式):具体状态对象通常是单例模式
享元模式(flyweight模式):享元模式解释了何时以及怎样共享状态对象
七、状态模式PHP示例

<?php
/**
 * 抽象状态角色
 */
interface State {
 
  /**
   * 方法示例
   */
  public function handle(Context $context);
}
 
/**
 * 具体状态角色A
 * 单例类
 */
class ConcreteStateA implements State {
  /* 唯一的实例 */
  private static $_instance = null;
 
  private function __construct() {
 
  }
 
  /**
   * 静态工厂方法,返还此类的唯一实例
   */
  public static function getInstance() {
    if (is_null(self::$_instance)) {
      self::$_instance = new ConcreteStateA();
    }
 
    return self::$_instance;
  }
 
  public function handle(Context $context) {
    echo 'Concrete Sate A handle method<br />';
    $context->setState(ConcreteStateB::getInstance());
  }
 
}
 
/**
 * 具体状态角色B
 * 单例类
 */
class ConcreteStateB implements State {
  /* 唯一的实例 */
 
  private static $_instance = null;
 
  private function __construct() {
  }
 
  /**
   * 静态工厂方法,返还此类的唯一实例
   */
  public static function getInstance() {
    if (is_null(self::$_instance)) {
      self::$_instance = new ConcreteStateB();
    }
 
    return self::$_instance;
  }
 
  public function handle(Context $context) {
    echo 'Concrete Sate B handle method<br />';
    $context->setState(ConcreteStateA::getInstance());
  }
 
}
 
/**
 * 环境角色
 */
class Context {
 
  private $_state;
 
  /**
   * 默认为StateA
   */
  public function __construct() {
    $this->_state = ConcreteStateA::getInstance();
  }
 
  public function setState(State $state) {
    $this->_state = $state;
  }
 
  public function request() {
    $this->_state->handle($this);
  }
 
}
 
/**
 * 客户端
 */
class Client {
 
  /**
   * Main program.
   */
  public static function main() {
    $context = new Context();
    $context->request();
    $context->request();
    $context->request();
    $context->request();
  }
 
}
 
Client::main();
?>

以上就是使用php实现状态模式的代码,还有一些关于状态模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
ob_start(),ob_start('ob_gzhandler')使用
Dec 25 PHP
PHP用身份证号获取星座和生肖的方法
Nov 07 PHP
php跨站攻击实例分析
Oct 28 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
PHP动态编译出现Cannot find autoconf的解决方法
Nov 05 PHP
Zend Framework教程之Zend_Layout布局助手详解
Mar 04 PHP
PHP互换两个变量值的方法(不用第三变量)
Nov 14 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
Nov 16 PHP
PHP对象相关知识总结
Apr 09 PHP
PHP观察者模式原理与简单实现方法示例
Aug 25 PHP
PHP实现新型冠状病毒疫情实时图的实例
Feb 04 PHP
浅谈PHP中的那些魔术常量
Dec 02 PHP
学习php设计模式 php实现适配器模式
Dec 07 #PHP
分享五个PHP7性能优化提升技巧
Dec 07 #PHP
学习php设计模式 php实现工厂模式(factory)
Dec 07 #PHP
学习php设计模式 php实现原型模式(prototype)
Dec 07 #PHP
PHP中Enum(枚举)用法实例详解
Dec 07 #PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 #PHP
学习php设计模式 php实现门面模式(Facade)
Dec 07 #PHP
You might like
PHP编实现程动态图像的创建代码
2008/09/28 PHP
字母顺序颠倒而单词顺序不变的php代码
2010/08/08 PHP
如何突破PHP程序员的技术瓶颈分析
2011/07/17 PHP
eaglephp使用微信api接口开发微信框架
2014/01/09 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
php魔术函数__call()用法实例分析
2015/02/13 PHP
smarty中常用方法实例总结
2015/08/07 PHP
js计数器代码
2006/11/04 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
2012/03/07 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
javascript操作referer详细解析
2014/03/10 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
Vue组件和Route的生命周期实例详解
2018/02/10 Javascript
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
nodejs的安装使用与npm的介绍
2019/09/11 NodeJs
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
python调用cmd复制文件代码分享
2013/12/27 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
Python选择网卡发包及接收数据包
2019/04/04 Python
详解python itertools功能
2020/02/07 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
澳大利亚墨尔本的在线时装店:LORETA
2018/09/14 全球购物
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
《美丽的公鸡》教学反思
2014/02/25 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
市级三好生竞选稿
2015/11/21 职场文书
python代码实现备忘录案例讲解
2021/07/26 Python
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python