设计模式14-观察者模式

1. 概念

观察者模式是一种软件设计模式,也称为发布-订阅模式。在这种模式中,存在一个被称为主题(Subject)的对象,以及若干个观察者(Observer)对象。主题对象维护了一个观察者对象列表,当主题对象的状态发生变化时,它会通知所有的观察者对象,使它们能够自动更新。

这种模式常被用于构建分布式系统、事件处理系统以及MVC(模型-视图-控制器)架构中。它可以有效地降低组件之间的耦合性,让系统更易于扩展和维护。

在观察者模式中,主题对象通常具有以下几个核心方法:

  1. 注册观察者:用于向主题对象注册一个观察者对象。
  2. 注销观察者:用于从主题对象中注销一个观察者对象。
  3. 通知观察者:用于通知所有注册的观察者对象,主题对象的状态已经发生了改变。

而观察者对象则会实现一个更新方法,用于在接收到主题对象的通知后进行相应的更新操作。

这种模式的优点在于它能够提供一种松耦合的方式,使得主题对象和观察者对象能够相互独立地变化,同时也方便了系统的维护和扩展。

2.示例

import java.util.ArrayList;
import java.util.List;

// 主题接口
interface Subject {
    void registerObserver(Observer observer);
    void unregisterObserver(Observer observer);
    void notifyObservers();
}

// 观察者接口
interface Observer {
    void update();
}

// 具体主题类
class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void unregisterObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }

    // 具体业务逻辑,当主题状态变化时调用此方法
    public void stateChanged() {
        // 做一些状态变化的处理
        System.out.println("主题状态发生了改变!");
        // 通知所有观察者
        notifyObservers();
    }
}

// 具体观察者类
class ConcreteObserver implements Observer {
    private String name;

    public ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void update() {
        System.out.println(name + "收到了主题的通知,进行相应的更新操作。");
    }
}

public class ObserverPatternExample {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();

        ConcreteObserver observer1 = new ConcreteObserver("观察者1");
        ConcreteObserver observer2 = new ConcreteObserver("观察者2");

        // 注册观察者
        subject.registerObserver(observer1);
        subject.registerObserver(observer2);

        // 主题状态发生变化
        subject.stateChanged();

        // 取消注册观察者
        subject.unregisterObserver(observer1);

        // 主题状态再次发生变化
        subject.stateChanged();
    }
}

这个示例中,ConcreteSubject类实现了Subject接口,而ConcreteObserver类实现了Observer接口。当主题状态发生改变时,ConcreteSubject会调用notifyObservers()方法通知所有注册的观察者,观察者会调用update()方法进行相应的更新操作。

main方法中,我们创建了一个具体主题对象subject,以及两个具体观察者对象observer1observer2。我们注册了这两个观察者对象,并模拟了主题状态的变化,观察者收到通知后进行相应的更新操作。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值