状态模式

简介: 《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。目录:设计模式Github地址:DesignPattern说明定义:状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。
目录:设计模式
Github地址:DesignPattern

说明

定义:状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

UML图:

img_dacd6acdbcdc13da91eddc4b16a3d538.png
状态模式UML图.png

代码实现:

State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。

abstract class State{
    public abstract void Handle(Context context);
}

ConcreteState类,具体状态。每一个子类实现一个与Context的一个状态相关的行为。

class ConcreteStateA extends State {

    @Override
    public void Handle(Context context) {
        context.setState(new ConcreteStateB());
    }
}

class ConcreteStateB extends State {

    @Override
    public void Handle(Context context) {
        context.setState(new ConcreteStateA());
    }
}

Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态。

class Context{
    private State state;
    // 定义Context的初始状态
    public Context(State state){
        this.state = state;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
        System.out.println("当前状态:"+state);
    }

    // 对请求做处理,并设置下一状态
    public void Request(){
        state.Handle(this);
    }
}

客户端代码

public class StatePattern {
    public static void main(String[] args){
        Context context = new Context(new ConcreteStateA());
        context.Request();
        context.Request();
        context.Request();
        context.Request();
    }
}

运行结果

当前状态:com.shijc.dp.state.ConcreteStateB@4554617c
当前状态:com.shijc.dp.state.ConcreteStateA@74a14482
当前状态:com.shijc.dp.state.ConcreteStateB@1540e19d
当前状态:com.shijc.dp.state.ConcreteStateA@677327b6

示例

例子:程序员的一天往往是比较固定的,上午的时候精神百倍,中午饿了犯困,需要午休;下午精神还不错,如果能准时下班必是极好的;但是如果加班到晚上,傍晚比较疲惫,如果加班到很晚,那就困极了睡着了。用程序模拟这个过程。

UML图:

img_3d03baeefcd5ce4507297b50d7a9d215.png
状态模式示例UML图.png

代码实现:

抽象状态类,定义一个抽象方法"写程序"

public abstract class WorkState {
    public abstract void WriteProgram(Work w);
}

上午工作状态

public class ForenoonState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        if (w.getHour()<12){
            System.out.println("当前时间:"+ w.getHour()+"点 上午工作,精神百倍");
        }else {
            w.setState(new NoonState());
            w.WriteProgram();
        }

    }
}

中午工作状态

public class NoonState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        if (w.getHour()<13){
            System.out.println("当前时间:"+ w.getHour()+"点 饿了,犯困,午休");
        }else {
            w.setState(new AfternoonState());
            w.WriteProgram();
        }

    }
}

下午工作状态

public class AfternoonState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        if (w.getHour()<17){
            System.out.println("当前时间:"+ w.getHour()+"点 下午状态还不错,继续努力");
        }else {
            w.setState(new EveningState());
            w.WriteProgram();
        }

    }
}

晚上工作状态

public class EveningState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        if (w.isFinish()){
            w.setState(new RestState());
            w.WriteProgram();
        }else {
            if (w.getHour()<21){
                System.out.println("当前时间:"+ w.getHour()+"点 加班哦,疲累至极");
            }else {
                w.setState(new SleepingState());
                w.WriteProgram();
            }
        }


    }
}

睡眠工作状态

public class SleepingState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        System.out.println("当前时间:"+ w.getHour()+"点 不行了,睡着了");

    }
}

下班状态

public class RestState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        System.out.println("当前时间:"+ w.getHour()+"点 下班回家了");

    }
}

工作类

public class Work {
    private WorkState current;
    public Work(){
        //工作初始化为上午工作状态,即上午9点开始上班
        current = new ForenoonState();
    }
    // 钟点属性,状态转换的依据
    private double hour;
    // 任务完成属性
    private boolean finish;

    public double getHour() {
        return hour;
    }

    public void setHour(double hour) {
        this.hour = hour;
    }

    public boolean isFinish() {
        return finish;
    }

    public void setFinish(boolean finish) {
        this.finish = finish;
    }

    public void setState(WorkState state){
        current = state;
    }

    public void WriteProgram(){
        current.WriteProgram(this);
    }
}

客户端代码

public class Main {
    public static void main(String[] args){
        Work emergencyProjects = new Work();
        emergencyProjects.setHour(9);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(10);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(12);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(13);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(14);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(17);

        emergencyProjects.setFinish(false);

        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(19);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(22);
        emergencyProjects.WriteProgram();
    }
}

运行结果

当前时间:9.0点 上午工作,精神百倍
当前时间:10.0点 上午工作,精神百倍
当前时间:12.0点 饿了,犯困,午休
当前时间:13.0点 下午状态还不错,继续努力
当前时间:14.0点 下午状态还不错,继续努力
当前时间:17.0点 加班哦,疲累至极
当前时间:19.0点 加班哦,疲累至极
当前时间:22.0点 不行了,睡着了
目录
相关文章
|
11天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
10天前
|
存储 人工智能 搜索推荐
终身学习型智能体
当前人工智能前沿研究的一个重要方向:构建能够自主学习、调用工具、积累经验的小型智能体(Agent)。 我们可以称这种系统为“终身学习型智能体”或“自适应认知代理”。它的设计理念就是: 不靠庞大的内置知识取胜,而是依靠高效的推理能力 + 动态获取知识的能力 + 经验积累机制。
352 131
|
10天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
443 131
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
4天前
|
存储 安全 前端开发
如何将加密和解密函数应用到实际项目中?
如何将加密和解密函数应用到实际项目中?
206 138
|
10天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
403 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
4天前
|
存储 JSON 安全
加密和解密函数的具体实现代码
加密和解密函数的具体实现代码
204 136
|
22天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1362 8
|
9天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。