学习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 相关文章推荐
php下过滤html代码的函数 提高程序安全性
Mar 02 PHP
PHP系列学习之日期函数使用介绍
Aug 18 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
Nov 07 PHP
PHP验证码函数代码(简单实用)
Sep 29 PHP
图解找出PHP配置文件php.ini的路径的方法
Aug 20 PHP
php浏览历史记录的方法
Mar 10 PHP
PHP判断网络文件是否存在的方法
Mar 12 PHP
php实现的美国50个州选择列表实例
Apr 20 PHP
PHP中Session和Cookie是如何操作的
Oct 10 PHP
Yii2.0表关联查询实例分析
Jul 18 PHP
PHP内置加密函数详解
Nov 20 PHP
关于php 高并发解决的一点思路
Apr 16 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
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
php版本的cron定时任务执行器使用实例
2014/08/19 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
php+xml编程之SimpleXML的应用实例
2015/01/24 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
浅谈PHP5.6 与 PHP7.0 区别
2019/10/09 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
php模拟实现斗地主发牌
2020/04/22 PHP
JS实现在线统计一个页面内鼠标点击次数的方法
2015/02/28 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
jQuery EasyUI 入门必看
2016/06/03 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
Python写的创建文件夹自定义函数mkdir()
2014/08/25 Python
python中import reload __import__的区别详解
2017/10/16 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
Python基于百度云文字识别API
2018/12/13 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
给Django Admin添加验证码和多次登录尝试限制的实现
2020/07/26 Python
python一些性能分析的技巧
2020/08/30 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
购买原创艺术品:Zatista
2019/11/09 全球购物
学生请假条
2014/04/11 职场文书
应聘教师自荐书
2014/06/16 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
python 如何在 Matplotlib 中绘制垂直线
2021/04/02 Python
CSS预处理框架——Stylus
2021/04/21 HTML / CSS