首页 > 其他分享 >行为型设计模式-状态 State

行为型设计模式-状态 State

时间:2023-09-07 13:34:50浏览次数:48  
标签:function 状态 Context state State context 设计模式 public

简介

跟状态机密切相关。有限状态机 FSM 包含 状态、事件、动作三个元素。

当发生一个事件时,引发老状态变成新状态,并执行一个动作。

状态和行为间一般是有限制的,如某些行为只能再某些状态下进行,某些状态只能触发某些行为。

简单的状态间转换可使用 if else。

更有条理的可以用查表法:二维表中纵向是状态,横向是事件,value则是新状态和动作。做成二维数组配置,事件发生时结合当前状态,组成[老状态][事件]索引去查二维表,得出value是新状态和动作,如果没有value则不变换

再复杂一些之后,可使用状态模式。

角色

  • Context 上下文

    可视为状态机,其内部持有State引用

    可通过改变State的值,来达到改变Context行为的目的

  • 抽象 State

  • 具体 State

类图

如图,Context/Machine中可以changeState来改变当前的状态,其中doThis和doThat签名与State一致,这样看起来就像改变状态的同时,改变了Context的行为。

类图

代码

class Context
{
    private $state;

    public function __construct(State $state)
    {
        $this->transitionTo($state);
    }

    public function transitionTo(State $state): void
    {
        echo "Context: Transition to " . get_class($state) . ".\n";
        $this->state = $state;
        $this->state->setContext($this);
    }

    public function request1(): void
    {
        $this->state->handle1();
    }

    public function request2(): void
    {
        $this->state->handle2();
    }
}
abstract class State
{
    protected $context;

    public function setContext(Context $context)
    {
        $this->context = $context;
    }

    abstract public function handle1(): void;

    abstract public function handle2(): void;
}

class ConcreteStateA extends State
{
    public function handle1(): void
    {
        echo "ConcreteStateA handles request1.\n";
        echo "ConcreteStateA wants to change the state of the context.\n";
        $this->context->transitionTo(new ConcreteStateB());
    }

    public function handle2(): void
    {
        echo "ConcreteStateA handles request2.\n";
    }
}

class ConcreteStateB extends State
{
    public function handle1(): void
    {
        echo "ConcreteStateB handles request1.\n";
    }

    public function handle2(): void
    {
        echo "ConcreteStateB handles request2.\n";
        echo "ConcreteStateB wants to change the state of the context.\n";
        $this->context->transitionTo(new ConcreteStateA());
    }
}

$context = new Context(new ConcreteStateA());
$context->request1();
$context->request2();

output:

Context: Transition to ConcreteStateA.
ConcreteStateA handles request1.
ConcreteStateA wants to change the state of the context.
Context: Transition to ConcreteStateB.
ConcreteStateB handles request2.
ConcreteStateB wants to change the state of the context.
Context: Transition to ConcreteStateA.

本文由mdnice多平台发布

标签:function,状态,Context,state,State,context,设计模式,public
From: https://www.cnblogs.com/caipi/p/17684595.html

相关文章

  • 行为型设计模式-策略 Strategy
    简介一组实现了同一个策略接口的策略,可以随时指定用哪一种策略完成业务。策略模式其实跟桥接模式很像,都是通过持有另一个对象,达到组合的效果。角色Context上下文可设置使用的Strategy抽象Strategy具体Strategy类图如图,Context使用setStrategy方法设置当前使......
  • 行为型设计模式-模板方法 Template Method
    简介父类抽象类定义大的处理流程,部分细节做成抽象方法,留给子类去实现。如Java的JUnit中,setUptearDown方法都是留给具体的测试用例来写,Servlet中service处理了一个请求的大部分工作,留下doGet和doPost给业务自定义处理。另外callback一般分两种方式:同步回调、异步回调,其中同步......
  • 08:49:45,218 WARN JDBCExceptionReporter:71 - SQL Error: 156, SQLState: S1000 关
    昨晚运行以前的一个项目,在初始化数据的时候报:08:49:45,218 WARNJDBCExceptionReporter:71-SQLError:156,SQLState:S100008:49:45,218ERRORJDBCExceptionReporter:72-关键字'user'附近有语法错误。org.hibernate.exception.GenericJDBCException:couldnotexecute......
  • 设计模式——建造者模式
    建造者模式简介1.建造者模式适用于一个具有较多的零件的复杂产品的创建过程,由于需求的变化,组成这个复杂产品的各个零件经常猛烈变化,但是他们的组合方式却相对稳定。他可以使你分步骤创建复杂的对象。建造者模式解决的问题一般当我们遇到一个非常复杂的对象的时候,这个对象里面有......
  • 【JAVA】java.lang.IllegalStateException: Failed to get nested archive for entry
    无脑看:解压后,替换lib里的jar,在本窗口用命令:jar-xvf ***.jar进行打包就行了。 一、背景:替换jar包中lib里的jar包1、在经过360压缩软件打开后进行了替换,运行报错 (PS.有时候不显示日志的时候可以在bat最后加一个pause)2、在经过WINRAR压缩软件进行存储(stor......
  • Modbus协议详解2:通信方式、地址规则、主从机通信状态
    首先我们要清楚:Modbus是一种串行链路上的主从协议,在通信线路上只能有一个主机存在,不会有多主机存在的情况。虽然主机只有一个,但是从机是可以有多个的。Modbus的通信过程都是由主机发起的,从机在接收到主机的请求后再进行响应,从机不会主动进行数据的发送。并且从机之间也不会互相发送......
  • Java设计模式-懒汉模式
    懒汉模式(LazyInitialization)是一种创建型设计模式,它用于在需要时才创建对象。这种模式的主要优点是节省资源,因为它只在真正需要对象时才创建实例。在Java中,懒汉模式可以通过使用静态内部类实现。以下是一个简单的Java懒汉模式示例:publicclassLazySingleton{//创建一个静......
  • 设计模式-建造者模式
    建造者模式是一种创建型的设计模式,将一个对象的创建过程拆分成一个个小的部分,每次决定其中的一个细节,构建出一个复杂对象对象的创建过程被拉长分散,可能会经历一系列的复杂决策,最终才会形成我们需要的对象对象拥有多个参数,或者拥有包含多个参数的构造函数,通过建造......
  • 结构型设计模式-组合(对象树) Composite
    简介组合模式又叫对象树,将对象按照树形结构串起来,呈现出局部和整体相同的特性。树中每个节点都由两部分组成,首先节点有自己的业务数据,其次节点内可以含有子节点集合。比如盒子中可以放物品,也可以放其他小盒子,小盒子里又可以放物品和其他更小的盒子。当计算盒子的物品价格时,只......
  • 结构型设计模式-桥接(模块化) Bridge
    简介桥接模式可将一系列紧密相关的、水平等级的类,转变为组合关系,形成垂直等级关系。如抽象类Color、Shape,分别有RedColor、BlueColor、CircleShape、SquareShape的实现类,那么想创建红色方形,则可以将Shape类中持有Color引用,动态向Shape中注入Color实现即可。否则分别......