Karp 的技术博客

概述

状态模式是一种行为型设计模式,它允许对象在其内部状态发生改变时改变其行为。该模式将对象的行为封装在不同的状态类中,并通过上下文对象进行管理和切换。

适用场景

状态模式适用于以下情况:

  • 当一个对象的行为取决于其内部状态,并且必须在运行时根据状态改变行为时。
  • 当一个对象的行为在不同的状态下具有不同的实现时。
  • 当需要通过组合而不是继承来扩展对象的行为时。

结构

状态模式由以下组件组成:

  • 上下文(Context):上下文对象包含一个对当前状态对象的引用,并在其内部状态改变时更新状态对象。
  • 抽象状态(Abstract State):抽象状态定义了一个接口,用于封装与上下文对象相关的行为。
  • 具体状态(Concrete State):具体状态类实现了抽象状态定义的接口,并根据具体的状态来实现相应的行为。

示例

<?php

// 上下文
class Context
{
    private $state;

    public function __construct()
    {
        // 初始化状态
        $this->state = new ConcreteStateA();
    }

    public function setState(State $state)
    {
        $this->state = $state;
    }

    public function request()
    {
        // 委托给当前状态处理请求
        $this->state->handle($this);
    }
}

// 抽象状态
interface State
{
    public function handle(Context $context);
}

// 具体状态A
class ConcreteStateA implements State
{
    public function handle(Context $context)
    {
        echo "当前状态为A,执行相关操作。" . PHP_EOL;
        // 切换状态
        $context->setState(new ConcreteStateB());
    }
}

// 具体状态B
class ConcreteStateB implements State
{
    public function handle(Context $context)
    {
        echo "当前状态为B,执行相关操作。" . PHP_EOL;
        // 切换状态
        $context->setState(new ConcreteStateA());
    }
}

// 客户端代码
$context = new Context();

// 执行一系列操作
$context->request();
$context->request();
$context->request();

在上面的示例中,我们定义了一个状态模式的实现。其中,Context类代表上下文对象,State接口代表抽象状态,ConcreteStateAConcreteStateB分别代表具体状态。

在客户端代码中,我们创建了一个Context对象,并通过调用request方法来触发操作。初始状态为ConcreteStateA,每次调用request后,当前状态会切换到另一个具体状态,并执行相应的操作。

通过使用状态模式,我们可以根据对象的内部状态来改变其行为,同时将不同状态的实现逻辑封装在不同的状态类中,提高代码的可维护性和可扩展性。

希望这个示例对您有所帮助!

php 设计模式

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2015年12月23日 02:10
6

目录

来自 《PHP设计模式:状态模式》