观察者模式是一种设计模式,它允许对象之间进行松耦合。在这种模式中,一个对象(称为主题)维护一组其他对象(称为观察者)的引用,并在状态发生变化时通知这些观察者。当主题的状态发生改变时,所有注册的观察者都会收到通知并自动更新自己。这种模式可以用于实现事件驱动、发布-订阅等场景,提高代码的可扩展性和可维护性。
在软件开发中,为了实现不同组件之间的松耦合,提高代码的可维护性和可扩展性,我们经常会使用一些设计模式,观察者模式(Observer Pattern)就是其中一种非常实用的设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者都会收到通知并自动更新。
观察者模式主要包括以下几个角色:
1、主题(Subject):定义了添加、删除和通知观察者的方法,主题是需要被观察的对象,它可以注册多个观察者,并在状态发生变化时通知它们。
2、观察者(Observer):实现了对主题对象状态变化的响应,当主题对象发生变化时,观察者会收到通知并执行相应的操作。
3、具体观察者(Concrete Observer):观察者的具体实现,实现了对主题对象状态变化的响应逻辑。
4、抽象观察者(Abstract Observer):定义了观察者的基本操作,如更新状态等,具体观察者可以继承抽象观察者的接口,并实现其方法。
下面我们通过一个简单的例子来说明观察者模式的用法:
假设我们有一个新闻发布系统,用户可以订阅感兴趣的新闻类别,当有新的文章发布时,系统会通知订阅了该类别的用户,在这个系统中,用户(Subject)和文章(Object)是需要被观察的对象,而用户订阅(Subscribe)和取消订阅(Unsubscribe)的行为则是用户的操作。
我们需要定义一个主题接口,用于注册和注销观察者:
public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); }
我们创建一个具体的主题类,实现主题接口:
import java.util.ArrayList; import java.util.List; public class NewsSubject implements Subject { private List<Observer> observers = new ArrayList<>(); private String newsContent; @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(newsContent); } } public void setNewsContent(String newsContent) { this.newsContent = newsContent; notifyObservers(); } }
我们创建一个抽象的观察者接口,用于定义观察者需要实现的方法:
public interface Observer { void update(String newsContent); }
我们创建一个具体的观察者类,实现抽象观察者接口:
public class User implements Observer { private String name; public User(String name) { this.name = name; } @Override public void update(String newsContent) { System.out.println(name + "收到了新消息:" + newsContent); } }
我们在主函数中创建一个具体的主题对象和多个具体的观察者对象,模拟用户订阅和取消订阅的过程: