一、项目需求与场景分析

在日常开发中,经常会遇到对象状态会发生改变,且不同状态下对应不同行为的场景。本次以天气预报为实战场景,实现一个可以动态切换天气状态、展示不同天气描述的 Java 程序,核心需求:

  1. 定义多种天气状态:多云、小雨、大雨、少云
  2. 天气对象可以动态切换状态
  3. 不同状态下展示对应的天气描述

这个场景完美契合状态模式(State Pattern) 的应用场景,也是 Java 面向对象中接口、多态、方法重写的核心实践。

二、核心知识点前置讲解

1. 接口(Interface)

  • 接口是一种特殊的抽象类型,只定义方法签名,不实现方法体
  • interface关键字定义,实现类必须重写(实现) 接口中所有的抽象方法
  • 作用:统一规范,让不同的类遵循相同的行为标准

2. 方法重写(Override)

  • 子类 / 实现类实现接口 / 继承父类后,重新定义父类 / 接口中的方法
  • 重写后,调用方法时会执行实现类的逻辑,实现多态

3. 状态模式(设计模式)

状态模式属于行为型设计模式:

  • 允许一个对象在其内部状态改变时改变它的行为
  • 将不同状态的逻辑封装到独立的类中,代码解耦、易扩展
  • 核心角色:环境类(Weather) + 状态接口(WeatherState) + 具体状态类

三、完整代码实现

我们严格按照题目模板,补全代码并实现完整功能:

1. 状态接口:WeatherState.java

统一规范所有天气状态的行为标准,只有一个展示天气的方法:

// 天气状态接口
public interface WeatherState {
    // 展示天气状态的抽象方法
    public void showState();
}

2. 环境核心类:Weather.java

上下文类,持有状态对象,负责切换状态并调用状态方法:

// 天气环境类(状态模式核心)
public class Weather {
    // 持有天气状态对象
    WeatherState state;

    // 展示当前天气状态
    public void show() {
        state.showState();
    }

    // 动态设置/切换天气状态
    public void setState(WeatherState s) {
        state = s;
    }
}

3. 具体状态实现类(补全题目【代码】)

CloudyDayState.java(多云)
// 多云状态
public class CloudyDayState implements WeatherState {
    // 【代码1】重写接口方法
    @Override
    public void showState() {
        System.out.print("多云.");
    }
}
HeavyRainState.java(大雨)
// 大雨状态
public class HeavyRainState implements WeatherState{
    // 【代码2】重写接口方法
    @Override
    public void showState() {
        System.out.print("大雨.");
    }
}
LightRainState.java(小雨)
// 小雨状态
public class LightRainState implements WeatherState {
    // 【代码3】重写接口方法
    @Override
    public void showState() {
        System.out.print("小雨.");
    }
}
CloudyLittleState.java(少云,题目已提供)
// 少云状态
public class CloudyLittleState implements WeatherState {
    @Override
    public void showState() {
        System.out.print("少云,有时晴.");
    }
}

4. 主程序:WeatherForecast.java

测试类,模拟北京天气预报,动态切换天气状态:

// 主类:天气预报
public class WeatherForecast {
    public static void main(String args[]) {
        // 创建天气对象
        Weather weatherBeijing = new Weather();
        
        System.out.print("\n 今天白天:");
        weatherBeijing.setState(new CloudyDayState());
        weatherBeijing.show();
        
        System.out.print("\n 今天夜间:");
        weatherBeijing.setState(new LightRainState());
        weatherBeijing.show();
        
        System.out.print("转:");
        weatherBeijing.setState(new HeavyRainState());
        weatherBeijing.show();
        
        System.out.print("\n 明天白天:");
        weatherBeijing.setState(new LightRainState());
        weatherBeijing.show();
        
        System.out.print("\n 明天夜间:");
        weatherBeijing.setState(new CloudyLittleState());
        weatherBeijing.show();
    }
}

四、运行结果

 今天白天:多云.
 今天夜间:小雨.转:大雨.
 明天白天:小雨.
 明天夜间:少云,有时晴.

五、代码原理解析

1. 执行流程

  1. 定义WeatherState接口,统一所有天气的行为规范
  2. 每个天气状态(多云、小雨等)单独创建类,实现接口并重写方法
  3. Weather类持有状态对象,通过setState()动态切换状态
  4. 调用show()时,自动执行当前状态类的showState()

2. 核心亮点

  • 接口多态WeatherState 引用可以指向任意实现类对象
  • 低耦合:新增天气状态时,只需要新建一个实现类,无需修改原有代码
  • 易维护:每种天气的逻辑独立封装,修改单个状态不影响其他状态

六、状态模式的优势(拓展思考)

如果不用状态模式,我们需要用大量if-else判断天气:

// 传统写法(冗余、难维护)
if(state.equals("多云")) System.out.print("多云");
else if(state.equals("小雨")) System.out.print("小雨");

对比状态模式:

  1. 消除冗余的条件判断语句
  2. 代码结构清晰,符合开闭原则(对扩展开放,对修改关闭)
  3. 适合状态多、行为复杂的场景(如订单状态、游戏角色状态等)

七、总结

本次天气预报小程序,是Java 接口、方法重写、多态、状态模式的综合实战:

  1. 接口用于定义统一规范,是面向抽象编程的核心
  2. 方法重写是实现多态的基础,让不同对象呈现不同行为
  3. 状态模式完美解决了对象状态动态切换、行为独立封装的问题
  4. 实际开发中,状态模式广泛应用于订单、流程、游戏等场景

更多推荐