目录

代码示例

<?php

/**
 * Description of StateDemo
 * 状态模式
 * @author jm
 */
class StateDemo
{
    //put your code here
    public static function main()
    {
        $state = new State();
        $context = new Context($state);
        $state->setValue("state1");
        $context->method();
        $state->setValue("state2");
        $context->method();

    }
}

class State {  
      
    private $_value;  
      
    public function getValue() {  
        return $this->_value;  
    }  
  
    public function setValue($value) {  
        $this->_value = $value;  
    }  
  
    public function method1(){  
        print_r("状态:".$this->_value.",执行方法".__METHOD__."\n");  
    }  
      
    public function method2(){  
        print_r("状态:".$this->_value.",执行方法".__METHOD__."\n");  
    }  
}  

  
/** 
 * 状态模式的切换类   2012-12-1 
 * @author erqing 
 *  
 */  
class Context {  
  
    /**
     *
     * @var \State
     */
    private $_state;  
  
    public function __construct($state) {  
        $this->_state = $state;  
    }  
  
    public function getState() {  
        return $this->_state;  
    }  
  
    public function setState($state) {  
        $this->_state = $state;  
    }  
  
    public function method() {  
        if ($this->_state->getValue() === "state1") {  
            $this->_state->method1();  
        } else if ($this->_state->getValue() === "state2") {  
            $this->_state->method2();  
        }  
    }  
}  

StateDemo::main();

输出

状态:state1,执行方法State::method1
状态:state2,执行方法State::method2

小结

状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

状态模式主要解决的当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简单化。

消除了庞大的条件分支语句。

状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少项目之间的依赖。

当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。


本文部分收藏来自互联网,仅用于学习研究,著作权归原作者所有,如有侵权请联系删除

markdown @TsingChan