定义
观察者模式又称为发布订阅模式。
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者,使他们能够自动更新自己。
场景举例
微信公众号订阅。
具体实现
定义发布者接口Observable
public interface Observable {
// 注册观察者
void registerObserver(Observer o);
// 删除观察者
void removeObserver(Observer o);
// 向所有观察者发布通知
void notifyObserver();
}
定义微信公众号服务类实现了Observable接口
public class WeChatServer implements Observable {
private List<Observer> list = new ArrayList<>();
private String message;
// 注册观察者
@Override
public void registerObserver(Observer o) {
list.add(o);
}
// 删除观察者
@Override
public void removeObserver(Observer o) {
if (!list.isEmpty()) {
list.remove(o);
}
}
// 发布消息给所有观察者
@Override
public void notifyObserver() {
for (Observer observer : list) {
observer.update(message);
}
}
// 新消息发布
public void publish(String s) {
this.message = s;
System.out.println("微信服务更新消息: " + s);
//消息更新,通知所有观察者
notifyObserver();
}
}
定义观察者接口
public interface Observer {
void update(String message);
}
定义用户类User实现Observer
public class User implements Observer {
private String name;
public User(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " 收到推送消息: " + message);
}
}
测试类
public class Test {
public static void main(String[] args) {
// 创建发布者
WeChatServer server = new WeChatServer();
// 创建观察者
Observer u1 = new User("张三");
Observer u2 = new User("李四");
Observer u3 = new User("王二麻子");
// 注册观察者
server.registerObserver(u1);
server.registerObserver(u2);
server.registerObserver(u3);
// 发布信息
server.publish("Java从入门到精通!");
System.out.println("----------------------------------------------");
// 移除观察者
server.removeObserver(u1);
// 发布信息
server.publish("Java从入门到入土!");
}
}
结果打印:
观察者模式总结
当一个对象的改变需要同时改变其它对象,并且它不知道具体要改变多个对象的时候,应该考虑使用观察者模式。
观察者模式所做的工作就是解除观察者与被观察者之间的耦合。