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

相关文章
|
3天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
3天前
|
设计模式 消息中间件 Java
Java 设计模式:探索发布-订阅模式的原理与应用
【4月更文挑战第27天】发布-订阅模式是一种消息传递范式,被广泛用于构建松散耦合的系统。在 Java 中,这种模式允许多个对象监听和响应感兴趣的事件。
19 2
|
3天前
|
设计模式 算法 Java
Java 设计模式:探索策略模式的概念和实战应用
【4月更文挑战第27天】策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在 Java 中,策略模式通过定义一系列的算法,并将每一个算法封装起来,并使它们可以互换,这样算法的变化不会影响到使用算法的客户。
9 1
|
3天前
|
设计模式 Java
Java 设计模式:工厂模式与抽象工厂模式的解析与应用
【4月更文挑战第27天】设计模式是软件开发中用于解决常见问题的典型解决方案。在 Java 中,工厂模式和抽象工厂模式是创建型模式中非常核心的模式,它们主要用于对象的创建,有助于增加程序的灵活性和扩展性。本博客将详细介绍这两种模式的概念、区别以及如何在实际项目中应用这些模式。
7 1
|
5天前
|
SQL Java 数据库
java代码中调用dao层查询接口,代码没有返回数据,打印出的sql查出了数据
java代码中调用dao层查询接口,代码没有返回数据,打印出的sql查出了数据
10 1
|
5天前
|
安全 Java 开发者
Java编程:深入探索其原理、特性与实战代码
Java编程:深入探索其原理、特性与实战代码
10 1
|
22天前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
21 0
|
1月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
37 0
|
2月前
|
设计模式 前端开发 JavaScript
观察者模式 vs 发布-订阅模式:两种设计模式的对决!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
18天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式