作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。
观察者模式(Observer Pattern)是一种行为型设计模式,它建立了一种一对多的依赖关系,让多个观察者对象同时监听一个被观察者对象的状态变化,当被观察者对象的状态发生变化时,会自动通知所有观察者对象进行相应的更新操作。
观察者模式也被称为发布-订阅(Publish-Subscribe)模式。
在观察者模式中,有
个核心角色。
观察者模式的核心思想是将观察者和被观察者解耦,使它们之间的依赖关系松散,从而实现对象间的松耦合。观察者模式能够在不改变被观察者和观察者之间的代码的情况下,动态地添加和删除观察者,从而提高了系统的灵活性和可扩展性。它常被用于事件处理、消息推送、GUI编程等场景。
下面是一个简单的 Java 代码示例,演示了观察者模式的实现,请同学们复制到本地执行。
import java.util.ArrayList;
import java.util.List;
// 被观察者接口
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 具体的被观察者
class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
private String message;
@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(message);
}
}
public void setMessage(String message) {
this.message = message;
notifyObservers();
}
}
// 观察者接口
interface Observer {
void update(String message);
}
// 具体的观察者
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " 收到消息:" + message);
}
}
public class ObserverPatternDemo {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver("观察者1");
ConcreteObserver observer2 = new ConcreteObserver("观察者2");
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.setMessage("Hello World!");
subject.removeObserver(observer1);
subject.setMessage("How are you?");
}
}
在上述示例中,ConcreteSubject
是具体的被观察者,实现了 Subject
接口,它维护了一个观察者列表,并实现了注册、删除和通知观察者的方法。
ConcreteObserver
是具体的观察者,实现了Observer
接口。它定义了更新方法,当收到被观察者的通知时,会执行相应的操作。
在 ObserverPatternDemo
类中,我们创建了一个具体的被观察者对象 subject
,以及两个具体的观察者对象 observer1
和 observer2
。我们通过调用 registerObserver
方法将观察者添加到被观察者的列表中。然后,我们调用 setMessage
方法来设置被观察者的消息,从而触发通知操作。
最后,我们通过调用 removeObserver
方法将一个观察者从被观察者的列表中移除,再次调用 setMessage
方法来触发通知操作。运行代码,可以看到观察者收到了相应的消息。
观察者模式在许多应用程序中都有广泛的应用,以下是观察者模式常见的应用场景,请同学们认真学习。
观察者模式适用于当一个对象的改变需要通知其他多个对象时,同时观察者对象之间应尽量保持独立,以减少耦合性。