Java 设计模式初体验:用状态模式实现天气预报程序
·
一、项目需求与场景分析
在日常开发中,经常会遇到对象状态会发生改变,且不同状态下对应不同行为的场景。本次以天气预报为实战场景,实现一个可以动态切换天气状态、展示不同天气描述的 Java 程序,核心需求:
- 定义多种天气状态:多云、小雨、大雨、少云
- 天气对象可以动态切换状态
- 不同状态下展示对应的天气描述
这个场景完美契合状态模式(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. 执行流程
- 定义
WeatherState接口,统一所有天气的行为规范 - 每个天气状态(多云、小雨等)单独创建类,实现接口并重写方法
Weather类持有状态对象,通过setState()动态切换状态- 调用
show()时,自动执行当前状态类的showState()
2. 核心亮点
- 接口多态:
WeatherState引用可以指向任意实现类对象 - 低耦合:新增天气状态时,只需要新建一个实现类,无需修改原有代码
- 易维护:每种天气的逻辑独立封装,修改单个状态不影响其他状态
六、状态模式的优势(拓展思考)
如果不用状态模式,我们需要用大量if-else判断天气:
// 传统写法(冗余、难维护)
if(state.equals("多云")) System.out.print("多云");
else if(state.equals("小雨")) System.out.print("小雨");
对比状态模式:
- 消除冗余的条件判断语句
- 代码结构清晰,符合开闭原则(对扩展开放,对修改关闭)
- 适合状态多、行为复杂的场景(如订单状态、游戏角色状态等)
七、总结
本次天气预报小程序,是Java 接口、方法重写、多态、状态模式的综合实战:
- 接口用于定义统一规范,是面向抽象编程的核心
- 方法重写是实现多态的基础,让不同对象呈现不同行为
- 状态模式完美解决了对象状态动态切换、行为独立封装的问题
- 实际开发中,状态模式广泛应用于订单、流程、游戏等场景
更多推荐
所有评论(0)