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 接口。客户端通过改变上下文的状态,可以改变上下文行为,从而实现在不同状态下执行不同操作的功能。

相关文章
|
9月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
615 6
|
10月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
1229 3
|
9月前
|
Java 数据处理 API
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
401 115
|
9月前
|
安全 Java 编译器
为什么你的Java代码需要泛型?类型安全的艺术
为什么你的Java代码需要泛型?类型安全的艺术
296 98
|
9月前
|
安全 Java 容器
告别繁琐判空:Optional让你的Java代码更优雅
告别繁琐判空:Optional让你的Java代码更优雅
|
9月前
|
安全 Java 容器
告别空指针噩梦:Optional让Java代码更优雅
告别空指针噩梦:Optional让Java代码更优雅
545 94
|
9月前
|
Java 编译器 API
java最新版和java8的区别,用代码展示
java最新版和java8的区别,用代码展示
701 43
|
设计模式 缓存 安全
Java设计模式的单例模式应用场景
Java设计模式的单例模式应用场景
453 4
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
282 4
|
设计模式 存储 负载均衡
【五】设计模式~~~创建型模式~~~单例模式(Java)
文章详细介绍了单例模式(Singleton Pattern),这是一种确保一个类只有一个实例,并提供全局访问点的设计模式。文中通过Windows任务管理器的例子阐述了单例模式的动机,解释了如何通过私有构造函数、静态私有成员变量和公有静态方法实现单例模式。接着,通过负载均衡器的案例展示了单例模式的应用,并讨论了单例模式的优点、缺点以及适用场景。最后,文章还探讨了饿汉式和懒汉式单例的实现方式及其比较。
【五】设计模式~~~创建型模式~~~单例模式(Java)