观察者模式
定义
在对象之间定义一对多的依赖,当一个对象发生改变,依赖它的对象会收到通知并自动更新.
简述
类似发布订阅模式,缺少一个调度中心.
使用场景例子
关注微信公众号,当公众号发布消息时,关注的用户就可以收到推送消息. 取消关注,则无法收到消息
类图
实现
- 定义一个抽象的被观察接口
package com.example.observer;
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
- 定义一个抽象的观察者接口
package com.example.observer;
public interface Observer {
void update(String message);
}
- 定义被观察者
package com.example.observer;
import java.util.ArrayList;
import java.util.List;
public class Publisher implements Subject {
private List<Observer> observers;
private String message;
public Publisher() {
observers = new ArrayList<Observer>();
}
@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 sendMessage(String message) {
this.message = message;
notifyObservers();
}
}
- 定义观察者
package com.example.observer;
public class Subscriber implements Observer {
private String name;
public Subscriber(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println("I'm " + this.name + ", recieve message:" + message);
}
}
- 编写测试类
package com.example.observer;
public class Test {
public static void main(String[] args) {
Publisher publisher = new Publisher();
Subscriber subscriber1 = new Subscriber("subscriber1");
Subscriber subscriber2 = new Subscriber("subscriber2");
Subscriber subscriber3 = new Subscriber("subscriber3");
publisher.registerObserver(subscriber1);
publisher.registerObserver(subscriber2);
publisher.registerObserver(subscriber3);
publisher.sendMessage("发布消息1");
System.out.println("==========");
publisher.removeObserver(subscriber2);
publisher.sendMessage("发布消息2");
}
}