状态模式-概述

在软件系统中,有些对象也像水一样具有多种状态,这些状态在某些情况下能够相互转换,

而且对象在不同的状态下也将具有不同的行为。相同的方法在不同的状态中可能会有不同的实现。

为了实现不同状态下对象的各种行为以及对象状态之间的相互转换。

复制代码
class Account {
    private String state;//状态
    private int balance;//余额
    
    //存款操作
    public void deposit(){
        stateCheck();
    }
    
    //取款操作
    public void withdraw(){
        if(state.equalsIgnoreCase("NormalState") ){
            //取款
            stateCheck();
        } else{
            //取款受限
        }
    }
    public void computeInterest(){
        if(state.equalsIgnoreCase("OverdraftState")){
            //计算利息
        }
    }
    //状态检查和转换操作
    public void stateCheck(){
        if(balance>=0){
            state= "NormalState"
        }
        else if(balance >-2000 && balance <0){
            state= "OverdraftState"
        }
        else if(balance == -2000){
            state= "RestrictedState"
        }
        else if(balance< -2000){
            //操作受限
        }
    }
    ......
}

发现存在几个问题:

1.几乎每个方法都包含状态判断语句,以判断在状态下是否具有该方法以及在特定状态下该方法如 何实现,导致代码非常冗长,可维护性较差。

2.拥有一个较为复杂的stateCheck()方法,包含大量的if...else if ...语句用于进行状态转换,代码测试难度较大,且不易维护。

3.系统扩展性较差,如果需要增加一个新的状态,如冻结(Frozen State)在该状态下既不允许存在也不允许取款,需要对原有代码进行大量修改,扩展起来非常麻烦。

为了解决这些问题,我们将对象在每一个状态下的行为和状态转移语句封装在一个个状态类中,通过这些状态类来分散冗长的条件转移语句

状态模式概述

状态模式用于解决系统中复杂的状态转换以及不同状态下行为的封装问题。

当系统中某个对象存在多个状态,

这些状态之间可以进行转换,

而且对象在不同状态下行为不相同时可以使用状态模式,

状态模式将一个对象的状态从该对象中分离出来,

封装到专门的状态类中,使得对象状态可以灵活变化。

对于客户端而言,无需关心对象状态的转换以及对象

所处的当前状态,无论对于何种状态的对象,客户端

都可以一致处理。

允许一个对象在其内部状态改变时改变它的行为,

对象看起来似乎修改了它的类。

其别名为状态对象,
在状态模式结构中包含如下几个角色:
1.Context环境类 ,它是拥有多种状态的对象。

由于环境类的状态存在多样性且在不同状态下

对象的行为有所不同,因此将状态独立出去形成

单独的状态类。在环境类中维护一个抽象状态类State的实例,

这个实例定义当前状态,在具体实现时,它是一个State子类的对象

2.State抽象状态类:

它用于定义一个接口以封装与环境类的一个特定状态相关的行为,

在抽象状态类中声明了各种不同状态对应的方法,

而在其子类中实现类这些方法,由于不同状态下对象的行为可能不同,

因此在不同子类中方法的实现可能存在不同,相同的方法可以写在抽象

状态类中。
3.具体状态类,

我们将对象在不同状态下的行为封装到不同的状态类中。

相关推荐
风舞雪凌月几秒前
【趣谈】移动系统和桌面系统编程语言思考
java·c语言·c++·python·学习·objective-c·swift
jinanwuhuaguo1 分钟前
Claude Code 深度学习与场景应用完全指南:从入门到精通的全景实战
开发语言·人工智能·深度学习
Ricky_Theseus3 分钟前
C++全局变量、局部变量、静态全局变量、静态局部变量的区别
开发语言·c++
Thomas.Sir3 分钟前
第五章:RAG知识库开发之【利用RAG知识库实现智能AI系统:从零构建企业级智能问答应用】
人工智能·python·vue·状态模式·fastapi·智能
小此方4 分钟前
Re:从零开始的 C++ STL篇(十)map/set使用精讲:常见问题与典型用法(上)
开发语言·数据结构·c++·算法·stl
88号技师6 分钟前
2025年11月一区SCI-壁虎优化算法Gekko Japonicus Algorithm-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
Rabbit_QL7 分钟前
AI 编程助手中的两种“角色“:开发角色与业务角色
人工智能·状态模式
大数据新鸟7 分钟前
设计模式详解-状态模式
ui·设计模式·状态模式
RATi GORI8 分钟前
Spring Boot 整合 Keycloak
java·spring boot·后端
吴梓穆10 分钟前
UE5 c++ 模板函数
java·c++·ue5