观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。 观察者模式在设计模式中是明智之选之一。
在计算机科学中,设计模式是一种被广泛接受和应用的解决问题的模板,它们是经过时间考验的解决方案,可以帮助我们编写更简洁、更易于维护的代码,我们将深入探讨一种在许多编程语言和框架中都能找到的设计模式——观察者模式。
观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新,这种模式通常用于处理事件驱动的系统,例如用户界面更新、数据模型更改等。
观察者模式的主要组成部分包括:
1、主题(Subject):负责注册、注销和获取观察者的对象。
2、观察者(Observer):实现了某个接口(通常是update()
方法),当主题状态发生改变时会收到通知并执行相应的操作。
3、具体观察者(Concrete Observer):实现了观察者接口的具体类,定义了在接收到主题通知时需要执行的操作。
4、抽象观察者(Abstract Observer):定义了观察者接口的抽象方法,具体的观察者需要实现这些方法。
下面我们通过一个简单的例子来说明观察者模式的用法:
假设我们有一个新闻发布系统,每当有新的新闻发布时,所有订阅了该新闻的人都会收到通知,在这个系统中,发布者(Publisher)就是主题,订阅者(Subscriber)就是观察者。
我们需要定义一个新闻接口News
,它包含一个getTitle()
方法用于获取新闻标题:
public interface News { String getTitle(); }
我们创建一个具体的新闻类ConcreteNews
,实现了News
接口:
public class ConcreteNews implements News { private String title; public ConcreteNews(String title) { this.title = title; } @Override public String getTitle() { return title; } }
我们需要定义一个观察者接口Observer
,它包含一个update()
方法用于接收主题的通知:
public interface Observer { void update(News news); }
我们创建一个具体的观察者类ConcreteObserver
,实现了Observer
接口:
public class ConcreteObserver implements Observer { @Override public void update(News news) { System.out.println("收到新消息通知:" + news.getTitle()); } }
我们需要定义一个主题类Publisher
,它负责注册、注销和获取观察者:
import java.util.ArrayList; import java.util.List; public class Publisher { private List<Observer> observers = new ArrayList<>(); public void subscribe(Observer observer) { observers.add(observer); } public void unsubscribe(Observer observer) { observers.remove(observer); } public void notifyObservers(News news) { for (Observer observer : observers) { observer.update(news); } } }
我们可以创建一个发布者对象和多个订阅者对象,然后通过发布者的notifyObservers()
方法来发布新闻并通知所有的订阅者:
public class Main { public static void main(String[] args) { Publisher publisher = new Publisher(); Observer observer1 = new ConcreteObserver(); Observer observer2 = new ConcreteObserver(); Observer observer3 = new ConcreteObserver(); publisher.subscribe(observer1); publisher.subscribe(observer2); publisher.subscribe(observer3); publisher.notifyObservers(new ConcreteNews("Java发布了新版本")); } }