温馨提示×

温馨提示×

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

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

java观察者模式一定要接口吗

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

不一定。Java 中的观察者模式并不强制要求使用接口,是否使用接口取决于你的设计目的和灵活度需求。

下面从几个角度说明:


一、经典观察者模式(用接口)

这是《GoF 设计模式》中的标准做法:

interface Observer {
    void update(String msg);
}

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

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

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

优点

  • 解耦(主题不依赖具体观察者)
  • 符合面向接口编程
  • 更容易扩展和测试

二、不用接口,直接用具体类(也可以)

如果你只是简单场景,也可以:

class Observer {
    public void update(String msg) {
        System.out.println(msg);
    }
}

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

    public void add(Observer o) { list.add(o); }

    public void notify(String msg) {
        for (Observer o : list) o.update(msg);
    }
}

问题

  • 耦合度高
  • 无法接第三方类
  • 不利于扩展

三、使用 Java 内置机制(也算“不用自己写接口”)

Java 本身提供了:

  • java.util.Observer(已过时)
  • java.util.Observable(已过时)

或者更推荐:

  • 直接使用 事件机制
  • 或使用 函数式接口 + Lambda

函数式写法(Java 8+)

class Subject {
    private List<Consumer<String>> listeners = new ArrayList<>();

    public void subscribe(Consumer<String> c) {
        listeners.add(c);
    }

    public void publish(String msg) {
        listeners.forEach(c -> c.accept(msg));
    }
}

这里 没有自定义 Observer 接口,而是用 Consumer。


四、结论

✅ 观察者模式 ≠ 必须用接口
✅ 接口只是“推荐做法”,不是语法强制
✅ 是否用接口取决于:

  • 是否需要解耦
  • 是否要支持多种观察者
  • 项目规模和扩展性要求

如果你愿意,我可以:

  • 给你一个“不用接口的最小观察者示例”
  • 或对比“接口 vs 抽象类 vs Lambda”的适用场景
向AI问一下细节

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

AI
助
手