定义
- 对象之间多对一依赖的一种设计方案,依赖它的对象为被通知并更新信息
- 其实就是发布订阅功能,订阅了就有消息了
- 这个模式是松偶合的。改变主题或观察者中的一方,另一方不会受到影像。
该模式包含四个角色
- 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
- 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
- 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
- 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。
代码
- 以收邮件为例
import java.util.ArrayList;
import java.util.List;
public class test14 {
public static void main(String[] args) {
MailServer mailServer =new MailServer();
//整两个用户
Observer observer1 = new User("小黄");
Observer observer2 = new User("小青");
//注册一下
mailServer.add(observer1);
mailServer.add(observer2);
//发个消息
mailServer.setInfomation("小青即将升职。。。。");
System.out.println("======================");
//删除一个用户
mailServer.remove(observer1);
mailServer.setInfomation("小青交接完成");
/* 邮箱来消息了:小青即将升职。。。。
小黄 收到邮件内容 小青即将升职。。。。
小青 收到邮件内容 小青即将升职。。。。
======================
邮箱来消息了:小青交接完成
小青 收到邮件内容 小青交接完成*/
}
}
//被观察者接口
interface Observerable {
//增加
void add(Observer o);
//删除
void remove(Observer o);
//通知
void notice();
}
/**
* 观察者
* 定义了一个update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。
*/
interface Observer {
void update(String message);
}
//被观察者,实现邮箱服务
class MailServer implements Observerable {
List<Observer> list = null;
String message = null;
public MailServer() {
list = new ArrayList<>();
}
@Override
public void add(Observer o) {
list.add(o);
}
@Override
public void remove(Observer o) {
list.remove(o);
}
@Override
public void notice() {
for (Observer observer : list) {
observer.update(message);
}
}
void setInfomation(String s){
this.message=s;
System.out.println("邮箱来消息了:"+s);
//消息来了通知一下
notice();
}
}
//用户类
class User implements Observer{
private String name;
private String message;
public User(String name){
this.name=name;
}
@Override
public void update(String message) {
this.message=message;
System.out.println(name+" 收到邮件内容 "+message);
}
}