观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。发布订阅模式是一种事件驱动模型,允许多个对象订阅和发布事件,从而实现松耦合的通信。两者的主要区别在于,观察者模式是单向的,而发布订阅模式是双向的。
概述
观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并被自动更新,这种设计模式广泛应用于实现分布式事件处理、GUI组件的事件响应等场景。
关键概念
1、Subject(主题):负责维护一组观察者,并在状态变化时调用notifyObservers()
方法来通知所有观察者。
2、Observer(观察者):订阅了主题的状态变化,当主题状态发生变化时,它将接收到通知。
3、ChangeListener(变更监听器):在状态变化时,会触发某些操作或回调函数。
应用场景
1、GUI组件:如按钮点击、文本框输入等事件监听。
2、实时数据流:如股票价格、天气预报等实时数据的更新。
3、网络编程:处理来自服务器的更新信息。
4、游戏开发:游戏中的角色状态变化需要通知其他角色。
5、事件驱动编程:在异步任务中处理多个事件。
实现步骤
1、定义接口和抽象类:为观察者和主题定义公共接口,以及可能的抽象类。
2、创建具体类:创建具体的观察者类和主题类,继承上述接口和抽象类。
3、注册观察者:在主题类中,使用观察者列表存储观察者。
4、通知观察者:当主题状态发生变化时,调用notifyObservers()
方法。
5、添加/移除观察者:允许动态地添加或删除观察者。
示例代码
// 观察者接口 interface ChangeListener { void onChanged(String message); } // 主题类 class Subject { private List<ChangeListener> listeners = new ArrayList<>(); public void addChangeListener(ChangeListener listener) { listeners.add(listener); } public void removeChangeListener(ChangeListener listener) { listeners.remove(listener); } public void notifyObservers() { for (ChangeListener listener : listeners) { listener.onChanged("主题状态已改变"); } } } // 观察者类 class ConcreteObserver implements ChangeListener { @Override public void onChanged(String message) { System.out.println("收到消息:" + message); // 在这里执行与消息相关的操作 } } // 测试代码 public class ObserverPatternDemo { public static void main(String[] args) { Subject subject = new Subject(); ConcreteObserver observer1 = new ConcreteObserver(); ConcreteObserver observer2 = new ConcreteObserver(); subject.addChangeListener(observer1); subject.addChangeListener(observer2); // 模拟主题状态变化 String message = "主题状态发生改变"; subject.notifyObservers(); // 输出:收到消息:主题状态发生改变 } }
观察者模式是一种强大的设计模式,它允许系统解耦各个组件之间的关系,使得系统更加灵活和可扩展,通过实现这个模式,我们可以更好地处理并发事件,实现分布式系统中的数据同步,以及在多线程环境中保持组件状态的一致性。