介绍
观察者模式实质就是定义对象与依赖(对象)之前的关系(一对多),使得如果当前对象自身发生改变时,就可以自动通知其依赖(对象)让其发生改变
使用场景
消息队列(跨系统信息交互)
角色
Subject:抽象主题(被观察者)
ConcreteSubject:抽象主题的实现(被观察者)
Observer:观察者接口
ConcreteObserver:观察者接口实现(观察者)
入门案例:
UML图解:
代码:
[Subject]
//主题
public abstract class Subject {
//观察者集合
private List<Observer> observers = new ArrayList<>();
//添加观察者
public void attach(Observer observer){
observers.add(observer);
}
//移除观察者
public void detach(Observer observer){
observers.remove(observer);
}
//通知观察者
public void Notify(){
for (Observer observer : observers) {
observer.update();
}
}
}
[ConcreteSubject]
//具体的主题
public class MomSubject extends Subject {
//主题消息
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
[Observer]
public interface Observer {
void update();
}
[ConcreteObserver]
//具体的观察者
public class Son implements Observer {
//名字
private String name;
//观察的主题
private MomSubject subject;
public Son(String name, MomSubject subject) {
this.name = name;
this.subject = subject;
}
@Override
public void update() {
System.out.println(name + "..." + subject.getMsg());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Subject getSubject() {
return subject;
}
public void setSubject(MomSubject subject) {
this.subject = subject;
}
}
测试
public class Main {
public static void main(String[] args){
//创建主题
MomSubject subject = new MomSubject();
//设置观察该主题的观察者
subject.attach(new Son("小强", subject));
subject.attach(new Son("小红", subject));
//设置通知信息
subject.setMsg("吃饭了"); //变动处;做到当主题的msg属性发生改变时,依赖就随之发送变动
//通知观察者更新信息
subject.Notify();
/**
* output:
* 小强...吃饭了
小红...吃饭了
*/
}
}