发布时间:2023-01-07 文章分类:编程知识 投稿人:李佳 字号: 默认 | | 超大 打印

简介:

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

适用场景:

  1. 控制一个对象的状态改变过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类中。
  2. 一个对象的行为取决于它的状态,并且在运行时刻根据状态改变它的行为时,方便使用状态模式。

优点:

消除复杂的分支语句。

缺点:

增加类的数量,增加复杂度。

代码:

abstract class State {
    abstract function doSth(Order $order);
}
class ZeroStatus extends State {
    public function doSth(Order $order) {
        if($order->status == 0) {
            echo "已下单\n";
        } else {
            $order->setObj(new OneStatus());
            $order->doSth();
        }
    }
}
class OneStatus extends State {
    public function doSth(Order $order) {
        if($order->status == 1) {
            echo "已支付\n";
        } else {
            $order->setObj(new TwoStatus());
            $order->doSth();
        }
    }
}
class TwoStatus extends State {
    public function doSth(Order $order) {
        if($order->status == 2) {
            echo "待收货\n";
        } else {
            echo "...";
        }
    }
}
class Order {
    private $obj;
    public $status;
    public function __construct() {
        $this->obj = new ZeroStatus();
    }
    public function setObj(State $state) {
        $this->obj = new $state;
    }
    public function setStatus($status) {
        $this->status = $status;
    }
    public function doSth() {
        $this->obj->doSth($this);
    }
}
$order = new Order();
$order->setStatus(0);
$order->doSth();
$order->setStatus(1);
$order->doSth();
$order->setStatus(2);
$order->doSth();
$order->setStatus(3);
$order->doSth();