php状态设计模式
状态设计模式的关键就是,环境中拥有所需的全部状态对象,每个状态对象又引用了环境对象;环境对象通过维护一个当前状态属性(用于存放状态对象)从而对所需的全部状态对象产生影响。
下面演示了一个简单的状态设计模式,状态设计模式的核心在于47-49行:
<?php interface Status
{
function getProperty();
function getContext();
} abstract class BaseStatus implements Status
{
public $context; public function __construct(BaseContext $context)
{
$this->context = $context;
} public function getContext()
{
return $this->context;
}
} abstract class BaseContext
{
public $currentStatus; public function changeStatus(Status $status)
{
$this->currentStatus = $status;
} public function statusDetail()
{
return $this->currentStatus->getProperty();
}
} class Context extends BaseContext
{
public $status1;
public $status2;
public $status3; public function __construct()
{
$this->status1 = new Status1($this);
$this->status2 = new Status2($this);
$this->status3 = new Status3($this); $this->currentStatus = $this->status1;
}
} class Status1 extends BaseStatus
{
public function getProperty()
{
echo 'I am status1'.PHP_EOL;
if ($this->getContext()->currentStatus instanceof self) {
echo 'here is status two and status three<br/>';
$this->context->status2->getProperty();
echo '<br/>';
$this->context->status3->getProperty();
echo '<br/>';
}
}
} class Status2 extends BaseStatus
{
public function getProperty()
{
echo 'I am status2'.PHP_EOL;
if ($this->getContext()->currentStatus instanceof self) {
echo 'here is status one and status three<br/>';
$this->context->status1->getProperty();
echo '<br/>';
$this->context->status3->getProperty();
echo '<br/>';
}
}
} class Status3 extends BaseStatus
{
public function getProperty()
{
echo 'I am status3'.PHP_EOL;
if ($this->getContext()->currentStatus instanceof self) {
echo 'here is status one and status two<br/>';
$this->context->status1->getProperty();
echo '<br/>';
$this->context->status2->getProperty();
echo '<br/>';
}
}
} $context = new Context(); $context->statusDetail(); $context->changeStatus($context->status2); $context->statusDetail(); $context->changeStatus($context->status3); $context->statusDetail();
运行结果:
I am status1 here is status two and status three
I am status2
I am status3
I am status2 here is status one and status three
I am status1
I am status3
I am status3 here is status one and status two
I am status1
I am status2
可见,每次环境对象切换状态的时候,环境对象内的任何修改对于所有状态对象都是同步可见的(状态对象均引用了环境对象)。
php状态设计模式的更多相关文章
- State状态设计模式
1.状态模式:改变对象的行为 一个用来改变类的(状态的)对象. 2:问题:当你自己实现 State 模式的时候就会碰到很多细节的问题,你必须根据自己的需要选择合适的实现方法, 比如用到的状态(Stat ...
- State Design Pattern 状态设计模式
设置好内部状态,然后依据不同的函数作为行为模式,进行状态转换. 有点像Finite Automata算法,两者的思想是一样的. 会Finite Automata,那么这个设计模式就非常easy了. # ...
- 使用C# (.NET Core) 实现状态设计模式 (State Pattern)
本文的概念性内容来自深入浅出设计模式一书 项目需求 这是一个糖果机的需求图. 它有四种状态, 分别是图中的四个圆圈: No Quarter: 无硬币 Has Quater 有硬币 Gumball So ...
- State模式(状态设计模式)
State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于 ...
- python设计模式之状态模式
python设计模式之状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态 ...
- 深入探索Java设计模式(二)之策略模式
策略设计模式是Java API库中常见的模式之一.这与另一个设计模式(称为状态设计模式)非常相似.本文是在学习完优锐课JAVA架构VIP课程—[框架源码专题]中<学习源码中的优秀设计模式> ...
- python设计模式第2版
python设计模式第2版 目录 第1章 设计模式简介 1 1.1 理解面向对象编程 1 1.1.1 对象 2 1.1.2 类 2 1.1.3 方法 2 1.2 面向对象编程的主要概念 3 1.2.1 ...
- C#设计模式:状态者模式(State Pattern)
一,什么是状态设计模式? 1,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 2,当一个对象的内部状态改变时允许改变其行为,这个对象看起来像是 ...
- 第18章 备忘录模式(Memento Pattern)
原文 第18章 备忘录模式(Memento Pattern) 备忘录模式 概述: 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Toke ...
随机推荐
- WCF分布式服务2-服务配置部署
上图整理了服务配置过程中所用到的基本的元素,大致的步骤: 1. 主要是首先要在调用服务的程序集中添加服务的一个引用. 2. 然后添加一个service并指定服务的名称.终结点. 在添加一个servi ...
- webapp js与安卓,ios怎么交互
) } } export default { callhandler (name, data, callback) { setupWebViewJavascriptBridge(function (b ...
- 一条命令将windows下多个ts文件合并为一个ts文件
首先在待合并的文件夹下创建concat.bat(名字随意啦),写入如下命令 copy /b "%~dp0"\*.ts "%~dp0"\new.ts 执行该命令后 ...
- ngnix 500错误原因分析
参考http://www.cnblogs.com/huqiang/p/5333975.html
- C#词频统计 效能分析
在邹老师的效能分析的建议下对上次写过的词频统计的程序进行分析改进. 效能分析:个人很浅显的认为就是程序的运行效率,代码的执行效率 1.VS 提供了自带的分析工具:performance tool (性 ...
- LeetCode - X of a Kind in a Deck of Cards
In a deck of cards, each card has an integer written on it. Return true if and only if you can choos ...
- PythonStudy——赋值运算符 Assignment operator
eg: num = 10 num += 1 # 等价于 num = num + 1 => 11 print(num) 特殊操作: 1.链式赋值 a = b = num print(a, b, n ...
- goaccess iis w3c 自定义log 格式参考
goaccess 支持强大的自定义log 格式,比如我们需要分析iis w3c 格式日志 参考iis w3c 字段 date time s-ip cs-method cs-uri-stem cs-ur ...
- mysql悲观锁
悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念. 悲观锁(Pessimistic Lock) 悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能 ...
- DHCP Option43配置
在配置Option 43之前,需要保证:1. AP与DHCP服务器之间路由可达,即AP可以获取到IP地址.2. AP与AC之间路由可达,保证AP获取到AC地址后,能够与AC交互信息,建立CAPWAP隧 ...