观察者模式和发布订阅模式都是软件设计模式,它们的目的是为了实现松耦合(loosely coupled)。观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。而发布订阅模式也是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个主题对象的状态发生改变时,它的所有订阅者都会收到通知并自动更新。两者的区别在于实现方式不同,但是它们的目的是相同的。
本文目录导读:
在编程领域,设计模式是一种被广泛认可的解决问题的最佳实践,观察者模式(Observer Pattern)作为一种常用的设计模式,广泛应用于实现事件驱动、解耦和异步通信等场景,本文将对观察者模式进行详细解读,并通过实例演示如何运用观察者模式进行编程。
观察者模式简介
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生改变时,会通知所有观察者对象,使它们能够自动更新自己。
观察者模式组成部分
1、主题(Subject):主题是需要被观察的对象,它维护了一个观察者列表,并提供了添加、删除、通知观察者的方法。
2、观察者(Observer):观察者是一个实现了特定接口的对象,当主题状态发生改变时,会收到通知并执行相应的操作。
3、具体观察者(Concrete Observer):具体观察者是观察者的实现类,它实现了观察者接口中的方法。
4、抽象观察者(Abstract Observer):抽象观察者是观察者接口的抽象实现,定义了观察者的通用行为。
观察者模式应用场景
1、事件处理:当某个事件发生时,通知所有注册的观察者对象。
2、数据更新:当数据模型发生改变时,通知所有注册的视图对象。
3、消息推送:当服务器接收到客户端发送的消息时,通知所有订阅了该消息的客户端。
4、用户界面交互:当用户界面上的一个元素发生变化时,通知所有关联的其他元素。
观察者模式实现步骤
1、定义主题接口:定义一个包含添加、删除、通知观察者方法的主题接口。
public interface Subject { void addObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); }
2、实现具体主题:创建一个实现了主题接口的具体主题类。
import java.util.ArrayList; import java.util.List; public class ConcreteSubject implements Subject { private List<Observer> observers; private int state; public ConcreteSubject() { observers = new ArrayList<>(); } @Override public void addObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(state); } } }
3、实现具体观察者:创建一个实现了观察者接口的具体观察者类。
public abstract class AbstractObserver implements Observer { private String name; public AbstractObserver(String name) { this.name = name; } public abstract void update(int state); }
4、实现具体观察者的具体子类:创建一个继承自抽象观察者的具体的观察者子类。
public class ConcreteObserverA extends AbstractObserver implements ConcreteObserverAInterface { public ConcreteObserverA() { super("ConcreteObserverA"); } @Override public void update(int state) { System.out.println(getName() + " received state change to " + state); } }