在编程领域,设计模式是一种被广泛接受和应用的解决方案,它们为解决特定问题提供了一种可重用的、经过验证的方法,本文将深入探讨观察者模式(Observer Pattern),这是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
观察者模式主要包括以下几个组成部分:
1、抽象主题(Subject):定义了添加、删除和通知观察者的方法。
2、具体主题(ConcreteSubject):实现了抽象主题的具体类,负责维护观察者的列表,并在状态发生变化时通知观察者。
3、抽象观察者(Observer):定义了一个接口,用于在主题状态发生变化时接收通知。
4、具体观察者(ConcreteObserver):实现了抽象观察者的具体类,负责处理接收到的通知。
5、封装:通过将具体的主题和观察者类封装在一起,使得它们可以在不同的上下文中复用。
下面我们通过一个简单的例子来说明观察者模式的用法:
假设我们有一个新闻发布系统,新闻发布者(Publisher)需要订阅感兴趣的新闻类别(Category),当某个新闻类别发布了新新闻时,订阅该类别的所有新闻发布者都会收到通知,在这个系统中,新闻发布者就是观察者,新闻类别就是主题。
我们定义一个抽象主题接口Subject
,包含添加、删除和通知观察者的方法:
public interface Subject { void addObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); }
我们创建一个具体主题类ConcreteSubject
,实现Subject
接口,并维护一个观察者列表:
import java.util.ArrayList; import java.util.List; public class ConcreteSubject implements Subject { private List<Observer> observers = new ArrayList<>(); private String message; @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(message); } } }
我们定义一个抽象观察者接口Observer
,包含一个处理通知的方法:
public interface Observer { void update(String message); }
我们创建一个具体观察者类ConcreteObserver
,实现Observer
接口,并根据接收到的消息进行相应的处理:
public class ConcreteObserver implements Observer { private String name; public ConcreteObserver(String name) { this.name = name; } @Override public void update(String message) { System.out.println(name + " received message: " + message); } }
我们在主函数中创建一个新闻发布者对象和一个新闻类别对象,并将它们关联起来:
public class Main { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); ConcreteObserver observer1 = new ConcreteObserver("News A"); ConcreteObserver observer2 = new ConcreteObserver("News B"); ConcreteObserver observer3 = new ConcreteObserver("News C"); subject.addObserver(observer1); subject.addObserver(observer2); subject.addObserver(observer3); subject.notifyObservers(); // 当有新新闻发布时,所有订阅的观察者都会收到通知并进行处理。