23种设计模式,状态模式的概念优缺点以及JAVA代码举例

简介: 【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。

状态模式(State Pattern)

状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。

概念

  • Context(上下文):维护一个指向当前状态的引用,并允许客户端进行操作,其行为随着其状态对象的改变而改变。
  • State(状态):定义一个接口,封装与上下文的一个特定状态相关的行为。
  • Concrete States(具体状态):实现状态接口的类,每一个类代表了上下文的一种状态。

优点

  1. 封装了转换规则:状态模式将所有与特定状态相关的行为放到一个对象中。
  2. 通过将所有状态相关的代码放在一个位置,简化了上下文:上下文变得非常简单,只需要维护一个当前状态的引用,并将所有状态的工作委托给状态对象。
  3. 允许新增状态类来改变行为:通过创建新的具体状态类,可以很容易地添加新的状态和转换。

缺点

  1. 可能会导致类的数目增加:每增加一个状态,就需要增加一个具体状态类,这可能会导致系统中类的数量剧增。
  2. 可能会导致某些状态和转换的逻辑复杂化:如果状态数目过多或转换逻辑过于复杂,会使得系统难以理解和维护。

Java代码示例

考虑一个简单的文本编辑器,具有两种状态:正常状态和删除状态,可以在这两种状态之间切换,并根据当前状态执行不同操作。

java复制代码

// 状态接口
interface State {
    void writeName(StateContext context, String name);
}

// 具体状态1:正常状态
class NormalState implements State {
    public void writeName(StateContext context, String name){
        System.out.println(name);
    }
}

// 具体状态2:删除状态
class DeleteState implements State {
    public void writeName(StateContext context, String name){
        System.out.println(name.toUpperCase().replace("A", ""));
    }
}

// 上下文
class StateContext {
    private State currentState;

    public StateContext(){
        currentState = new NormalState();
    }

    public void setState(State state) {
        currentState = state;
    }

    public void writeName(String name){
        currentState.writeName(this, name);
    }
}

// 客户端代码
public class StatePatternDemo {
    public static void main(String[] args) {
        StateContext context = new StateContext();

        context.writeName("Saturday");
        context.setState(new DeleteState());
        context.writeName("Saturday");
    }
}

在这个例子中,StateContext 类维护了一个当前状态的引用,并允许客户端根据当前状态执行操作。NormalStateDeleteState 是具体状态,分别实现了 State 接口。客户端通过改变上下文的状态,可以改变上下文行为,从而实现在不同状态下执行不同操作的功能。

相关文章
|
7月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
926 157
|
7月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
498 6
|
7月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
739 2
|
7月前
|
Java 数据处理 API
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
350 115
|
7月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
1820 35
|
7月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
548 8
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
332 16
|
12月前
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
336 0
|
12月前
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
464 0
|
12月前
|
设计模式 安全 Java
并发设计模式实战系列(12):不变模式(Immutable Object)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十二章,废话不多说直接开始~
280 0