java 之 状态模式(大话设计模式)

本文通过一个简单的工作场景案例,介绍了状态模式的基本概念及其实现方式,展示了如何通过状态模式避免使用复杂的条件判断语句,使代码更易于维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看过大话设计模式的小伙伴,都知道大话设计模式中的demo代码不是JAVA的,对于编程来说,设计模式不限于任何语言,讲述的是编程的思想。

今天笔者再次看这篇文章时,看了下别人的博客对于设计模式的理解,希望能汲取点其中的核心思想,意外的是看到很多博客对状态模式理解的可能有些偏差。

正常来说,如果没有状态模式的情况下,我们会用一堆if else if或者 switch case来处理。寻找到正确的入口!这样的代码违背了单一原则,日后维护会牵一发而动全身。

使用状态模式能够很好的解决这个问题,来看下类图

大话设计模式-类图

再看下简单的笔者的例子:

/**
 * 抽象状态接口
 */
public interface State {

    public void WriteProgram(Work work);
}
/**
 * 上下文
 */
public class Work {

    private State state;

    private Integer hour;

    public Work() {
        state = new GoodMorning();
    }
    
    public void writeProgram() {
        state.WriteProgram(this);
    }

    public Integer getHour() {
        return hour;
    }

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

    public void setState(State state) {
        this.state = state;
    }
}
/**
 * 早晨状态 状态的一个分支
 */
public class GoodMorning implements State{

    @Override
    public void WriteProgram(Work work) {
        if (work.getHour() < 12) {
            System.out.println("工作状态很好啊");
        } else {
            work.setState(new AfterMorning());
            work.writeProgram();
        }

    }
}
/**
 * 状态的分支 下午状态
 */
public class AfterMorning implements State {

    @Override
    public void WriteProgram(Work work) {

        if (work.getHour() < 14) {
            System.out.println("有点困了");
        } else {
            work.setState(new Evening());
            work.writeProgram();
        }
    }
}
/**
 * 夜晚状态 状态的一个分支
 */
public class Evening implements State {

    @Override
    public void WriteProgram(Work work) {
        if (work.getHour() >= 19) {
            System.out.println("该下班了哦");
        }
    }

}

 

以上是笔者对状态模式的理解,如果需求有变更,增加某些状态,我们只需要在增加子类,如果是在中间插入状态,我们只需要改上一个状态的指向就可以了。

希望能帮助学习状态模式的小伙伴,不要生搬硬套设计模式,理解其精髓最重要!!!

转载于:https://www.cnblogs.com/zhuxiansheng/p/7999656.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值