温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java观察者模式如何解耦

发布时间:2026-09-13 07:53:47 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

在 Java 中,**观察者模式(Observer Pattern)**之所以能实现“解耦”,核心思想是:对象之间只依赖“抽象”,不依赖“具体实现”,且通过事件通知而不是直接调用。

下面从「为什么耦合」「如何解耦」「Java 中的实现方式」三个层面说明。


一、传统写法的耦合问题

紧耦合示例(坏味道)

class OrderService {
    public void createOrder() {
        EmailService email = new EmailService();
        SMSService sms = new SMSService();
        email.send();
        sms.send();
    }
}

问题:

  • OrderService 直接依赖 EmailService、SMSService
  • 新增通知方式要改 OrderService
  • 不利于测试和维护

二、观察者模式如何解耦

1️⃣ 依赖抽象而非具体类

定义观察者接口:

interface Observer {
    void update(String message);
}

被观察者只依赖 Observer:

class Subject {
    private List<Observer> observers = new ArrayList<>();

    public void addObserver(Observer o) {
        observers.add(o);
    }

    public void notifyObservers(String msg) {
        for (Observer o : observers) {
            o.update(msg);
        }
    }
}

✅ 被观察者 不知道 观察者是谁、做什么


2️⃣ 通过“注册 + 通知”替代直接调用

class EmailObserver implements Observer {
    public void update(String msg) {
        System.out.println("邮件通知:" + msg);
    }
}

class SMSObserver implements Observer {
    public void update(String msg) {
        System.out.println("短信通知:" + msg);
    }
}

使用:

Subject subject = new Subject();
subject.addObserver(new EmailObserver());
subject.addObserver(new SMSObserver());

subject.notifyObservers("订单创建成功");

✅ Subject 不需要修改代码 ✅ 新增观察者不影响原有逻辑


三、Java 内置观察者机制(解耦更彻底)

1️⃣ 使用 java.util.Observable(已过时但经典)

class Order extends Observable {
    public void create() {
        setChanged();
        notifyObservers("订单创建");
    }
}

class Logger implements Observer {
    public void update(Observable o, Object arg) {
        System.out.println(arg);
    }
}

2️⃣ 更推荐:使用事件机制(Spring / 自定义)

Spring 事件(最常用解耦方式)

// 事件
class OrderEvent extends ApplicationEvent {
    public OrderEvent(Object source) {
        super(source);
    }
}

// 发布者
@Service
class OrderService {
    @Autowired
    ApplicationEventPublisher publisher;

    public void create() {
        publisher.publishEvent(new OrderEvent(this));
    }
}

// 监听者(完全解耦)
@Component
class EmailListener {
    @EventListener
    public void onOrder(OrderEvent event) {
        System.out.println("发送邮件");
    }
}

✅ 发布者不依赖监听者
✅ 可异步、可排序、可条件触发


四、观察者模式解耦的本质总结

维度 传统方式 观察者模式
依赖关系 具体类 抽象接口
调用方式 主动调用 被动通知
扩展方式 改源码 注册新观察者
测试难度 高 低

五、一句话总结

Java 观察者模式通过将“行为触发”与“行为响应”分离,用接口和事件通知代替直接方法调用,从而实现对象之间的低耦合、高扩展。

如果你愿意,我可以:

  • 用 真实业务场景(订单 / 日志 / MQ)举例
  • 对比 观察者 vs 监听器 vs 发布订阅
  • 帮你设计一个 Spring 观察者架构图
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手