状态模式

简介: 《大话设计模式》阅读笔记和总结。原书是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点 不行了,睡着了
目录
相关文章
|
6天前
|
人工智能 JSON 监控
Claude Code 源码泄露:一份价值亿元的 AI 工程公开课
我以为顶级 AI 产品的护城河是模型。读完这 51.2 万行泄露的源码,我发现自己错了。
4252 17
|
16天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
11677 138
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
5天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
1443 8
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
6天前
|
人工智能 自然语言处理 数据挖掘
零基础30分钟搞定 Claude Code,这一步90%的人直接跳过了
本文直击Claude Code使用痛点,提供零基础30分钟上手指南:强调必须配置“工作上下文”(about-me.md+anti-ai-style.md)、采用Cowork/Code模式、建立标准文件结构、用提问式提示词驱动AI理解→规划→执行。附可复制模板与真实项目启动法,助你将Claude从聊天工具升级为高效执行系统。
|
6天前
|
人工智能 定位技术
Claude Code源码泄露:8大隐藏功能曝光
2026年3月,Anthropic因配置失误致Claude Code超51万行源码泄露,意外促成“被动开源”。代码中藏有8大未发布功能,揭示其向“超级智能体”演进的完整蓝图,引发AI编程领域震动。(239字)
2413 9