一、前言:为什么我们需要设计模式?
作为初学者,当我们学习编程时经常会遇到这样的困境:写出来的代码虽然功能实现了,但扩展性差、耦合度高。每次需求变更都像在走钢丝,稍有不慎就会引发连锁BUG。设计模式就是前辈们总结出的最佳实践套路,它们像乐高积木的标准化零件,能帮我们构建出更灵活可靠的系统。今天我们就用生活化的案例,深入剖析最常用的两种模式:观察者模式(Observer) 和 工厂模式(Factory)。
二、观察者模式:构建智能通知系统
2.1 什么是观察者模式?
想象一个气象站场景:当温度变化时,需要自动通知手机App、电子广告牌和空调系统。如果写成这样:
// 反面案例
class WeatherStation {
void temperatureChanged(float temp) {
phoneApp.update(temp);
billboard.display(temp);
airConditioner.adjust(temp);
}
}
这种写法存在三个致命问题:
- 紧耦合:气象站需要知道所有依赖对象
- 难以扩展:新增显示器需要修改核心类
- 违反开闭原则:每次变更都要重新测试
2.2 观察者模式优雅解决方案
// 1. 定义主题接口
interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
// 2. 实现气象站主题
class WeatherStation implements Subject {
private List<Observer> observers = new ArrayList<>();
private float temperature;
public void setTemperature(float temp) {
this.temperature = temp;
notifyObservers(); // 数据变化时通知所有观察者
}
@Override
public void notifyObservers() {
for (Observer o : observers) {
o.update(temperature);
}
}
// 其他接口实现省略...
}
// 3. 定义观察者接口
interface Observer {
void update(float temperature);
}
// 4. 实现具体观察者
class PhoneApp implements Observer {
@Override
public void update(float temp) {
System.out.println("[手机] 当前温度:" + temp + "℃");
}
}
class Billboard implements Observer {
@Override
public void update(float temp) {
System.out.println(