Java设计模式之观察者(Observer)模式

观察者模式是一种设计模式,用于建立对象间的依赖关系,当一个对象状态改变时,所有依赖它的对象都会得到通知并自动更新。文中提供了代码示例来解释如何实现这一模式,并提到了在JDK事件、Spring框架和Android广播中的应用。
摘要由CSDN通过智能技术生成

观察者(Observer)模式可以在多个对象之间建立一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知。

什么是观察者模式

观察者模式(Observer pattern)是一种非常常用的设计模式,它可以建立一种一对多的依赖关系,确保当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知。在观察者模式中,通常会定义一个主题对象和多个观察者对象。主题对象负责维护一组观察者对象,并在自身状态发生改变时通知这组观察者对象。观察者对象可以是任何类型的对象,它们会在主题对象发生改变时接收到通知,并进行相应的逻辑处理。

观察者模式的应用场景

  1. 当一个对象的状态改变时,需要通知其他对象进行相应的处理时,可以使用观察者模式。例如,当系统中某个数据模型发生变化时,需要立即通知到已经注册过该模型变化的其他组件进行处理。

  2. 当需要将不同子系统之间的解耦时,可以使用观察者模式。例如,当子系统之间需要进行消息传递,但是又不希望子系统之间直接进行耦合时,可以使用观察者模式进行消息传递。

观察者模式的代码示例

以下是一个简单的观察者模式示例代码:

主题对象接口:

public interface Subject {
    public void attach(Observer observer); // 添加观察者
    public void detach(Observer observer); // 删除观察者
    public void notifyObservers(); // 通知所有观察者
}

观察者对象接口:

public interface Observer {
    public void update(); // 观察者对象接收到通知后的逻辑处理
}

具体主题对象类:

public class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<Observer>(); // 存储所有观察者对象
    private int subjectState; // 主题对象状态
    
    public void attach(Observer observer) {
        observers.add(observer); // 添加观察者
    }
    
    public void detach(Observer observer) {
        observers.remove(observer); // 删除观察者
    }
    
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(); // 通知所有观察者
        }
    }
    
    public int getState() {
        return subjectState;
    }
    
    public void setState(int state) {
        this.subjectState = state;
        notifyObservers(); // 主题对象状态发生改变,通知所有观察者
    }
}

具体观察者对象类:

public class ConcreteObserver implements Observer {
    private int observerState; // 观察者对象状态
    private Subject subject; // 主题对象
    
    public ConcreteObserver(Subject subject) {
        this.subject = subject;
        subject.attach(this); // 将该观察者对象注册到主题对象中
    }
    
    public void update() {
        observerState = subject.getState(); // 观察者对象接收到通知后更新自身状态
        System.out.println("Observer state updated: " + observerState); // 打印输出更新后的状态值
    }
}

测试代码:

public class ObserverPatternDemo {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject(); // 创建主题对象
        ConcreteObserver observer1 = new ConcreteObserver(subject); // 创建观察者对象1,并将其注册到主题对象中
        ConcreteObserver observer2 = new ConcreteObserver(subject); // 创建观察者对象2,并将其注册到主题对象中
        
        subject.setState(10); // 改变主题对象的状态,触发所有观察者对象更新逻辑
    }
}

运行结果:

Observer state updated: 10
Observer state updated: 10

在上面的示例代码中,我们首先定义了主题对象接口 Subject 和观察者对象接口 Observer。然后我们实现了具体的主题对象类 ConcreteSubject 和具体的观察者对象类 ConcreteObserver,在具体主题对象类中添加、删除和通知观察者对象,更改状态值并且通知所有的观察者对象。在具体观察者对象类 ConcreteObserver 中,实现更新自身状态的逻辑和打印输出更新后状态原来的值。在 ObserverPatternDemo 中我们创建主题对象,并创建两个观察者对象并将它们注册到主题对象中,再改变主题对象的状态,触发所有观察者对象更新逻辑,最后打印输出更新后的状态值。

观察者模式的实际应用

在实际开发中,观察者模式是一个非常常用的设计模式,在许多框架中都有使用,下面是一些常用框架中使用了观察者 Observer 设计模式的例子:

  1. JDK 中的事件机制: JDK 中提供了大量的事件类和接口,从而实现了一种事件驱动模型。例如 ActionListener 接口、MouseListener 接口等等都是观察者接口,实现它们的类都是观察者对象,而主题对象则是事件源对象(如按钮对象等)。

  2. Spring 框架中的事件机制: Spring 框架中也提供了事件机制,可以通过 ApplicationContext 对象向所有注册的监听器对象发送事件,从而实现一种松耦合的消息传递方式。在 Spring 中,事件源对象可以是任何对象,而事件监听器就是观察者对象。

  3. Android 中的广播机制: Android 中有一种广播机制,可以用于组件间的信息传递。在广播机制中,发送广播的对象就是事件源对象,而广播接收器则是观察者对象。

  4. JavaFX 框架中的 Property 机制: JavaFX 中的 Property 对象是观察者模式的实现,它允许绑定两个对象,当其中一个对象的值发生变化时,另一个对象会自动更新为最新值。

关注微信公众号:“小虎哥的技术博客”。我们会定期发布关于Java技术的详尽文章,让您能够深入了解该领域的各种技巧和方法,让我们一起成为更优秀的程序员👩‍💻👨‍💻!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小虎哥的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值