Java 设计模式情景分析——观察者模式

本文介绍了观察者模式的基本概念及其在GUI系统、发布/订阅系统中的应用。观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。文章通过具体代码示例展示了如何实现观察者模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

观察者模式是一种使用频率非常高的模式,有时也被称作发布/订阅模式,属于行为型模式,它最常用的是 GUI 系统、发布/订阅系统,它一个重要作用就是解耦,使得它们之间的依赖性更小。观察者模式定义了对象间一种一对多的依赖关系,使得每当一个对象改变状态时,则所有依赖于它的对象都会得到通知并被自动更新。

观察者模式的使用情景:

  • 关联行为场景;
  • 事件多级触发场景;
  • 跨系统的消息交换场景(如消息队列、事件总线的处理机制);

1.观察者模式

观察者模式
优点1、观察者和被观察者之间是耦合抽象,应对业务变化;
2、增强了系统灵活性、可扩展性;
缺点1、开发调试变的比较复杂,Java中消息的通知是顺序执行,一个消息的卡顿会影响整体的执行效率,所以使用观察者模式还需要结合异步操作的方式;

UML 类图:

观察者模式 UML 类图

Subject 表示抽象主题,是被观察(Observable)的角色,ConcreteSubject 表示具体主题,Observer 表示抽象观察者,ConcreteObserver 表示具体的观察者。

1.代码实现

观察者 Observer 和被观察者 Observable 是 JDK 中的内置类型。

1、创建观察者:

public class MyObserver implements Observer {
    private String name;
    public MyObserver(String name) {
        this.name = name;
    }
    @Override
    public void update(Observable o, Object arg) {
        System.out.println(name + ", update:" + arg);
    }
}

2、创建被观察者:

public class MyObservable extends Observable {
    public void postNewPublication(String content) {
        // 标识状态或者内容发生改变
        setChanged();
        // 通知所有观察者
        notifyObservers(content);
    }
}

测试代码:

@Test
public void test() throws Exception {
    // 被观察者
    MyObservable observable = new MyObservable();
    // 观察者
    MyObserver observer1 = new MyObserver("test1");
    MyObserver observer2 = new MyObserver("test2");
    MyObserver observer3 = new MyObserver("test3");
    MyObserver observer4 = new MyObserver("test4");
    // 将观察者注册到被观察者对象的观察者列表中
    observable.addObserver(observer1);
    observable.addObserver(observer2);
    observable.addObserver(observer3);
    observable.addObserver(observer4);
    // 发布消息
    observable.postNewPublication("new");
}

输出结果:

test4, update:new
test3, update:new
test2, update:new
test1, update:new

可以看到所有订阅了被观察者的观察者都接收到了更新消息,一对多的订阅——发布系统就完成了。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值