码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之行为型模式—— 3.4 状态模式

时间:2015-02-17 23:42:19      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:设计模式 状态模式

<?php
/**
 * 3.4 状态模式
 *  定义:
 *      当一个对象的内在状态改变时允许改变其行为,这个对象看
 *      起来像是改变了其类。
 *  角色:
 *      1. 抽象状态类
 *          职责:定义一个接口以封装与Context的一个特定状态
 *                相关的行为。
 *      2. 具体状态类
 *          职责:每一个具体的状态类实现一个与Context的一个
 *                状态相关的行为。
 *      3. Context类
 *          职责:维护一个具体状态类的实例,这个实例定义当前
 *                的状态。
 *  优点:
 *      1. 将与特定状态相关的行为局部化,并且将不同状态的行
 *         为分隔开来。
 *  缺点:
 *      1. 会增加类和对象的个数;
 *      2. 此模式的机构和实现都比较复杂,如果使用不当将导致
 *         程序结构和代码的混乱。
 * 使用场景:
 *      1. 如果一个对象的行为取决于它的状态,并且它必须在
 *         运行时,时刻根据状态改变它的行为。
 *      2. 一个操作中含有庞大的多分支条件语句,且这些分支
 *         依赖于该对象的状态。
 */

header(‘content-type:text/html;charset=utf8‘);

//抽象状态类
abstract class State{
    abstract public function handle(Context $context);
}
//具体状态类
class ConcreteStateA extends State{
    public function handle(Context $context){
        $context->setState(new ConcreteStateB());
    }
}
class ConcreteStateB extends State{
    public function handle(Context $context){
        $context->setState(new ConcreteStateC());
    }
}
class ConcreteStateC extends State{
    public function handle(Context $context){
        $context->setState(new ConcreteStateA());
    }
}
//Context类
class Context{
    private $state;
    public function __construct(State $state){
        $this->state=$state;
    }
    public function setState($state){
        $this->state=$state;
        echo ‘当前状态:‘.get_class($this->state);
    }
    public function getState(){
        return $this->state;
    }
    public function request(){
        $this->state->handle($this);
    }
}

//客户端
$context1=new Context(new ConcreteStateB());
$context1->request();


本文出自 “一切皆有可能” 博客,请务必保留此出处http://noican.blog.51cto.com/4081966/1614786

设计模式之行为型模式—— 3.4 状态模式

标签:设计模式 状态模式

原文地址:http://noican.blog.51cto.com/4081966/1614786

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!