在计算机科学和软件工程领域,设计模式是一种被广泛接受和应用的解决问题的方法,观察者模式是23种设计模式中的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新,这种模式在很多场景下都非常有用,比如在图形用户界面(GUI)中,当用户点击按钮时,可能会触发一系列的操作;或者在实时数据流处理中,当数据发生变化时,需要通知所有的监听器。
观察者模式的核心组件包括:主题(Subject)、观察者(Observer)和具体观察者(ConcreteObserver),主题是一个可以注册、注销以及通知观察者的类;观察者是一个实现了特定接口的对象,它可以在主题状态发生改变时收到通知;具体观察者则是实现了某种业务逻辑的具体类。
下面我们通过一个简单的例子来说明如何使用观察者模式,假设我们有一个新闻发布系统,新闻发布者(Publisher)发布了一篇新闻,而订阅了这篇新闻的所有读者(Subscriber)都需要收到通知,在这个系统中,发布者就是主题,读者就是观察者。
我们需要定义一个抽象的主题接口(Subject),它包含了添加、删除和通知观察者的方法:
public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); }
我们定义一个具体的主题类(ConcreteSubject),它实现了上面定义的抽象接口:
public class ConcreteSubject implements Subject { private List<Observer> observers = new ArrayList<>(); private String news; public void setNews(String news) { this.news = news; notifyObservers(); } @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(news); } } }
我们需要定义一个抽象的观察者接口(Observer),它包含了更新方法:
public interface Observer { void update(String news); }
我们定义一个具体的观察者类(ConcreteObserver),它实现了上面定义的抽象接口:
public class ConcreteObserver implements Observer { private String name; public ConcreteObserver(String name) { this.name = name; } @Override public void update(String news) { System.out.println(name + " has received the news: " + news); } }
我们在主函数中创建一个具体的主题对象和一些具体的观察者对象,然后将观察者对象注册到主题对象中: