大话设计模式第十六章--状态模式

<?php
abstract class State {
    abstract public function handle(Context $context);
}

class Concrete_state_A extends State {
    public function handle(Context $context) {
        echo "NOW IS IN STATE_A <br/>";
        $context->state = new Concrete_state_B();
    }
}

class Concrete_state_B extends State {
    public function handle(Context $context) {
        echo "NOW IS IN STATE_B <br/>";
        $context->state = new Concrete_state_A();
    }
}

class Context {
    private $state;
    public function __construct(State $state) {
        $this->state = $state;
    }
    public function __get($param) {
        if ($param == 'state') {
            return $this->state;
        }
    }
    public function __set($param, $state) {
        if ($param == 'state') {
            $this->state = $state;
        }
    }

    public function request() {
        $this->state->handle($this);
    }
}

//CLIENT CODE
$c = new Context(new Concrete_state_A());
$c->request();
$c->request();
$c->request();
$c->request();

 

状态模式:

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

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

好处:

  将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

  通过定义新的子类可以很容易地增加新的状态和转换。

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

posted @ 2015-09-01 19:23  wy0314  阅读(166)  评论(0编辑  收藏  举报