若转载教程,请注明出自SW-X框架官方文档1
<?php
/**
* 设计模式之状态模式
* 使用场景 大量和对象状态相关的条件语句
* 小黄牛
*/
header("Content-type: text/html; charset=utf-8");
/**
*
* 派生出相关的接口状态
*/
interface IState{
function WriteCode($Work);
}
/**
* 春季
*/
class AState implements IState{
function WriteCode($Work){
if($Work->hour == '春'){
echo '春季,要下雨啦!<br/>';
}else{
# 调用回调方法,去访问夏季方法
$Work->SetState(new BState());
$Work->WriteCode();
}
}
}
/**
* 夏季
*/
class BState implements IState{
function WriteCode($Work){
if($Work->hour == '夏'){
echo '夏季,好热额!<br/>';
}else{
# 调用回调方法,去访问秋季方法
$Work->SetState(new CState());
$Work->WriteCode();
}
}
}
/**
* 秋季
*/
class CState implements IState{
function WriteCode($Work){
if($Work->hour == '秋'){
echo '秋季,恋爱的季节!<br/>';
}else{
# 调用回调方法,去访问冬季方法
$Work->SetState(new DState());
$Work->WriteCode();
}
}
}
/**
* 冬季
*/
class DState implements IState{
function WriteCode($Work){
if($Work->hour == '冬'){
echo '冬季,浪漫的季节!<br/>';
}else{
echo '你不是地球人!<br/>';
}
}
}
/**
* 处理季节筛选
*/
class Work{
public $hour; // 季节成员
private $current; // 季节对象实例
public $isDone;
/**
* 默认选择第一个筛选项
*/
public function __construct(){
$this->current = new AState();
}
/**
* 当筛选不正确时,调用该方法继续向下筛选
*/
public function SetState($S){
$this->current = $S;
}
/**
* 调用这个方法,使用筛选
*/
public function WriteCode(){
$this->current->WriteCode($this);
}
}
# 实例DEMO
$obj = new Work();
$obj->hour = '春';
$obj->WriteCode();
$obj->hour = '夏';
$obj->WriteCode();
$obj->hour = '秋';
$obj->WriteCode();
$obj->hour = '冬';
$obj->WriteCode();
$obj->hour = '小黄牛';
$obj->WriteCode();
浏览器输出
春季,要下雨啦!
夏季,好热额!
秋季,恋爱的季节!
冬季,浪漫的季节!
你不是地球人!
状态模式1
上下文环境(Work):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的具体对象来处理。
抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
具体状态(AmState):实现抽象状态定义的接口。
应用场景
当一个对象的条件表达式过于复杂的情况下,可以使用状态模式,把复杂的判断进行逻辑简化(有点类似递归向下的模式)。