Skip to content

面试速答(先看这里)

**一句话结论:**天气变化是典型的事件驱动场景,需通知多个订阅方(如通知服务、推荐服务), 观察者模式天然支持一对多依赖关系,实现低耦合的事件响应机制。

60秒标准回答:

当天气不同时,用户会收到不同的通知,通知中包括具体的天气和推荐的行程

这里有两个点,一个是天气不同的时候发通知,还有一个就是不同的天气发送的内容不一样

天气变化是典型的事件驱动场景,需通知多个订阅方(如通知服务、推荐服务), 观察者模式天然支持一对多依赖关系,实现低耦合的事件响应机制

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**当天气不同时,用户会收到不同的通知,通知中包括具体的天气和推荐的行程。
  • **要点2:**这里有两个点,一个是天气不同的时候发通知,还有一个就是不同的天气发送的内容不一样。
  • **要点3:**不同天气对应不同的行程推荐策略(如晴天推荐户外活动、雨天推荐室内活动),策略模式通过 封装可互换的业务逻辑 实现逻辑灵活切换。
  • **要点4:**那么其实就是需要结合 观察者模式 和 策略模式 两种设计模式。

**记忆锚点:**策略模式 → 观察者模式 → RecommendationService → NotificationService → WeatherService → 策略接口

加分表达:

  • 天气变化是典型的事件驱动场景,需通知多个订阅方(如通知服务、推荐服务), 观察者模式天然支持一对多依赖关系,实现低耦合的事件响应机制。

追问准备:

  • 围绕「策略模式」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「观察者模式」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「RecommendationService」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

当天气不同时,用户会收到不同的通知,通知中包括具体的天气和推荐的行程。

典型回答 ​

这里有两个点,一个是天气不同的时候发通知,还有一个就是不同的天气发送的内容不一样。

天气变化是典型的事件驱动场景,需通知多个订阅方(如通知服务、推荐服务),观察者模式天然支持一对多依赖关系,实现低耦合的事件响应机制。

不同天气对应不同的行程推荐策略(如晴天推荐户外活动、雨天推荐室内活动),策略模式通过封装可互换的业务逻辑实现逻辑灵活切换。

那么其实就是需要结合 观察者模式 和 策略模式两种设计模式。

观察者模式 ​

  • Subject(被观察者):天气服务(WeatherService),负责监测天气变化,并管理观察者列表。

  • Observer(观察者):定义通知接口(如 sendNotification),由具体观察者实现。

  • NotificationService:向用户发送天气变化的通知。

  • RecommendationService:生成并推送推荐行程。

java
+-------------------+          +-------------------+
|   WeatherService  |<>------->| WeatherObserver   |
+-------------------+          +-------------------+
| - observers: List |          | + update(Weather) |
| + register()      |          +-------------------+
| + unregister()    |                     ʌ
| + notify()        |          +-----------+-----------+
+-------------------+          |                       |
                               v                       v
                  +---------------------+  +---------------------+
                  | NotificationService |  | RecommendationService |
                  +---------------------+  +---------------------+
                  | + update(Weather)   |  | - strategy: Strategy |
                  +---------------------+  | + update(Weather)   |
                                           | + setStrategy()     |
                                           +---------------------+
  1. 用户和行程服务订阅天气服务(注册为观察者)。
  2. 天气变化时,WeatherService 调用 notify(),遍历所有观察者。
  3. 每个观察者(如 NotificationService 和 RecommendationService)执行各自的更新逻辑。

策略模式 ​

  • 策略接口:Strategy,定义生成推荐的方法(如 generateRec())。
  • 具体策略:针对不同天气实现推荐逻辑,如 SunnyDayStrategy、RainyDayStrategy。
java
+-------------------+          +-------------------+
|   WeatherService  |<>------->| WeatherObserver   |
+-------------------+          +-------------------+
| - observers: List |          | + update(Weather) |
| + register()      |          +-------------------+
| + unregister()    |                     ʌ
| + notify()        |          +-----------+-----------+
+-------------------+          |                       |
                               v                       v
                  +---------------------+  +---------------------+
                  | NotificationService |  | RecommendationService |
                  +---------------------+  +---------------------+
                  | + update(Weather)   |  | - strategy: Strategy |
                  +---------------------+  | + update(Weather)   |
                                           | + setStrategy()     |
                                           +---------------------+
                                                      ʌ
                                                      |
                                             +--------+--------+
                                             | Strategy         |
                                             +-----------------+
                                             | + generateRec()  |
                                             +-----------------+
                                                      ʌ
                                      +---------------+---------------+
                                      |                               |
                                      v                               v
                           +---------------------+         +---------------------+
                           | SunnyDayStrategy    |         | RainyDayStrategy    |
                           +---------------------+         +---------------------+
                           | + generateRec()     |         | + generateRec()     |
                           +---------------------+         +---------------------+
java
// 推荐服务 + 策略模式
class RecommendationService implements WeatherObserver {
    private RecommendationStrategy strategy;
    
    public void setStrategy(RecommendationStrategy strategy) {
        this.strategy = strategy;
    }
    
    @Override
    public void update(WeatherData data) {
        // 根据天气类型切换策略
        switch(data.getType()) {
            case SUNNY: setStrategy(new SunnyStrategy()); break;
            case RAINY: setStrategy(new RainyStrategy()); break;
        }
        String rec = strategy.generateRecommendation(data);
        sendRecommendation(rec);
    }
}

// 策略接口与实现
interface RecommendationStrategy {
    String generateRecommendation(WeatherData data);
}

class SunnyStrategy implements RecommendationStrategy {
    @Override
    public String generateRecommendation(WeatherData data) {
        return "今日晴,推荐去公园野餐,紫外线指数:" + data.getUVIndex();
    }
}