从原理到实践:面向对象设计中的经典模式-观察者模式
7.1、概念
1)观察者注册到列表中,List observers = new ArrayList<>()
2)当被观察者state发生变化,就会调用notify通过到观察者
3)每个观察者执行自己的update()方法
Java中的观察者模式(Observer Pattern)是一种常用 行为型设计模式,它定义了一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
在观察者模式中,有两个重要的角色:被观察者和观察者。当被观察者的状态发生改变时,它会通知所有的观察者对象,并调用它们的方法来进行更新操作。
以下是一个简单的Java观察者模式的示例代码:
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers = new ArrayList<>();
private int state;
//加入观察者
public void attach(Observer observer) {
observers.add(observer);
}
//去掉观察者
public void detach(Observer observer) {
observers.remove(observer);
}
//通知观察者
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
/*
* 状态变化
*/
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyObservers();
}
}
//观察者基类
public abstract class Observer {
protected Subject subject;
public Observer(Subject subject) {
this.subject = subject;
subject.attach(this);
}
public abstract void update();
}
public class BinaryObserver extends Observer {
public BinaryObserver(Subject subject) {
super(subject);
}
@Override
public void update() {
System.out.println("Binary String: " + Integer.toBinaryString(subject.getState()));
}
}
public class OctalObserver extends Observer {
public OctalObserver(Subject subject) {
super(subject);
}
@Override
public void update() {
System.out.println("Octal String: " + Integer.toOctalString(subject.getState()));
}
}
public class HexaObserver extends Observer {
public HexaObserver(Subject subject) {
super(subject);
}
@Override
public void update() {
System.out.println("Hex String: " + Integer.toHexString(subject.getState()).toUpperCase());
}
}
public class Main {
public static void main(String[] args) {
Subject subject = new Subject();
//加入观察者队列中
new BinaryObserver(subject);
new OctalObserver(subject);
new HexaObserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
System.out.println("Second state change: 10");
subject.setState(10);
}
}
在上面的示例中,Subject 是被观察者角色,它包含一个状态 state 和一组观察者对象。当 state 发生改变时,它会通知所有的观察者对象,并调用它们的 update() 方法进行更新操作。
Observer 是观察者角色的抽象类,它包含了一个指向被观察者对象的引用。在 Observer 的子类中,实现了 update() 方法来响应被观察者状态的变化。
BinaryObserver、OctalObserver 和 HexaObserver 分别是具体的观察者类,它们继承了 Observer 类,并实现了各自的 update() 方法,在状态发生变化时进行相应的更新。
在 Main 方法中,我们创建一个 Subject 对象,并为它添加三个观察者对象:BinaryObserver、OctalObserver 和 HexaObserver。然后,我们设置了两次不同的状态值,每次修改状态后,所有的观察者对象都会得到通知并更新自己的状态。最终输出结果如下:
First state change: 15
Binary String: 1111
Octal String: 17
Hex String: F
Second state change: 10
Binary String: 1010
Octal String: 12
Hex String: A
可以看到,当状态发生改变时,所有的观察者对象都会得到通知,并根据自己的实现进行更新操作。
7.2、应用
以下是基于事务、监听器的场景使用观察者模式
以下是一个使用Java实现的观察者模式示例,包括监听器和事件:
import java.util.ArrayList;
import java.util.List;
/**
* 事件类,用于存储监听器和通知监听器
*/
class Event {
private String name;
private List<Listener> listeners;
public Event(String name) {
this.name = name;
this.listeners = new ArrayList<>();
}
public void addListener(Listener listener) {
this.listeners.add(listener);
}
public void removeListener(Listener listener) {
this.listeners.remove(listener);
}
public void notifyListeners(Object object) {
for (Listener listener : listeners) {
listener.update(object);
}
}
}
/**
* 监听器接口,实现update方法来处理事件
*/
interface Listener {
void update(Object object);
}
/**
* 使用示例
*/
public class ObserverDemo {
public static void main(String[] args) {
// 创建一个事件实例
Event event = new Event("new_user");
// 创建两个监听器实例
Listener emailListener = new EmailListener();
Listener messageListener = new MessageListener();
// 向事件实例中添加监听器
event.addListener(emailListener);
event.addListener(messageListener);
// 发出事件通知
event.notifyListeners("Tom");
}
/**
* 邮件监听器,实现update方法来处理事件
*/
static class EmailListener implements Listener {
@Override
public void update(Object object) {
System.out.println("发送欢迎邮件给 " + object.toString());
}
}
/**
* 短信监听器,实现update方法来处理事件
*/
static class MessageListener implements Listener {
@Override
public void update(Object object) {
System.out.println("发送短信给 " + object.toString());
}
}
}
在上面的示例中,Event类表示一个事件,Listener接口表示监听器。每个事件都有一些监听器,它们会在事件发生时被通知。在这个示例中,我们创建了两个监听器:EmailListener和MessageListener,它们分别向新用户发送欢迎邮件和短信。最后,我们向event实例中添加两个监听器,并触发了一个事件通知,通知所有监听器有新用户Tom加入。
==============================================
如果文章对你有帮助,不要忘记加个关注、点个赞!!!必回关!!!
转载自:https://juejin.cn/post/7226387497566912572