《设计模式》状态模式

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路《设计模式》状态模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

《设计模式》状态模式

定义

  • 状态模式也称为状态机模式,允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
  • 属于行为型模式。

状态模式的角色组成

  • State(抽象状态类):定义一个接口用来封装与环境类的一个特定状态相关的行为,可以有一个或多个行为。
  • ConcreteState(具体状态类):作为抽象状态类的子类,每个子类实现一个与环境类的一个状态相关的行为。每个具体状态类对应环境类的一个具体状态,不同的具体状态类其行为有所不同。
  • Context(环境类):环境类中维护一个具体状态的实例,通常有多种状态,负责具体状态的切换。

状态模式的 UML 类图

在这里插入图片描述

🎈情景案例:CSDN 博客平台的内容管理模块对文章进行了统一管理,目前文章的状态分为“全部”、“全部可见”、“仅我可见”、“审核”、“草稿箱”和“回收站”这六种状态。不同状态文章的“行为”是不同的,例如,“全部”表示可以看到其他五种状态文章的合集,“全部可见”表示可以看到全部已经发表的设置设为公开的文章,“仅我可见”表示只能看到已经发布的私密文章,使用状态模式对该情景进行模拟编码。

抽象状态类 State

public interface State {
    void handle();
}

具体状态类 All

public class All implements State{
    @Override
    public void handle() {
        System.out.println("所有文章,包括所有公开文章、私密文章、审核文章、草稿文章、已经被删除的文章");
    }
}

具体状态类 AllVisible

public class AllVisible implements State{
    @Override
    public void handle() {
        System.out.println("所有公开文章");
    }
}

具体状态类 Private

public class Private implements State{
    @Override
    public void handle() {
        System.out.println("所有私密文章");
    }
}

具体状态类 Audit

public class Audit implements State{
    @Override
    public void handle() {
        System.out.println("所有审核文章");
    }
}

具体状态类 Manuscript

public class Manuscript implements State {
    @Override
    public void handle() {
        System.out.println("所有草稿文章");
    }
}

具体状态类 Recycled

public class Recycled implements State{
    @Override
    public void handle() {
        System.out.println("所有已经被删除的文章");
    }
}

环境类 Context

public class Context {
    private State state;

    public void setState(State state) {
        this.state = state;
    }

    void request() {
        this.state.handle();
    }
}

客户端类 Client

public class Client {
    public static void main(String[] args) {
        Context context = new Context();
        context.setState(new All());
        context.request();
        context.setState(new AllVisible());
        context.request();
        context.setState(new Private());
        context.request();
    }
}

状态模式的优点

  • 消除庞大的条件分支语句:将特定的状态独立为类,消除了冗余的 if...elseswitch...case 语句,使代码更加简洁,提高了系统的可维护性。
  • 状态转换显式化:将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。

状态模式的缺点

  • 类膨胀问题:如果一个事物具备很多状态,则会造成状态类太多。

状态模式的适用场景

  • 一个操作中含有庞大的多分支结构,并且这些分支取决于对象的状态。
  • 对象的行为依赖于它的状态(例如某些属性值),状态的改变将导致行为的变化。

🎈状态模式在 JDK 或 Spring 源码中的应用

很遗憾哈哈,目前无论是在 JDK 还是在 Spring 源码中,具体实现了状态模式的类和接口并不常见(也就是没有哈哈),因为状态模式并非是JDK 或 Spring 框架中广泛采用的设计模式之一。虽然可能没有明确称之为”状态模式”,但是可以找到一些与状态模式相似的设计。例如:

  • ThreadPoolExecutor 类是 Java 并发库中用于执行多个线程任务的线程池实现之一。它内部维护了线程池的状态,如 RUNNING、SHUTDOWN、STOP、TIDYING 和 TERMINATED 等。根据不同的状态,ThreadPoolExecutor 会在处理任务、关闭线程池等过程中执行不同的行为,从而实现了一种状态切换的逻辑。
  • 该示例只是在某种程度上与状态模式相似,而不是典型的状态模式应用。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/156993.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!