概念
- 行为模型关注对象间的交互,解决通信和协作,进一步明确对象的职责。
观察者又叫发布订阅。定义对象间一对多的依赖关系,当一个对象改变,所有依赖他的对象都会得到通知并更新。
实现方式
推:把通知以广播方式发给观察者,观察者只能被动接收。
拉:观察者只需要知道什么时候变了,什么时候拉去内容,什么内容,自主决定。
应用场景
关联行为场景,可拆分的关联。时间多级触发场景。
- 跨系统的消息交互场景,消息队列、事件总线的处理机制。
实现
```java //观察者接口,存放观察者共有的方法 public interface Observer{ void update(int state); }
//定义具体观察者 public class ObserverImpl implement Observer{
private int myState;
public void update(int state){
myState = state;
sout("收到消息,更新数据");
}
public int get MyStat(){
return myState;
}
}
//定义主题、以及观察者数组、实现增删和通知
public class Subject{
//线程安全
private CopyOnWriteArrayList
//注册观察者方法
public void registerObserver(Observer obs){
list.add(obs);
}
//删除观察者方法
public void removeObserver(Observer obs){
list.remove(obs);
}
//通知所有观察者更新
public void notifyAllObserver(int state){
for(Observer ob: list){
ob.update(satate);
}
}
}
//具体主题 public class RealSub extends Subject{
private int state;
public int getState(){
return state;
}
public void setState(int state){
this.state=state;
//主题对象(目标对象)值发生改变
this.notifyAllObserver(state);
}
}
//测试 public class Client{ public static void main(String[] args){ //目标对象 RealSub sb = new RealSub(); //创建多个观察者 ObserverImpl obs1 = new ObserverImpl(); ObserverImpl obs2 = new ObserverImpl(); ObserverImpl obs3 = new ObserverImpl(); //注册到观察者队列 sb.registerObserver(obs1); sb.registerObserver(obs2); sb.registerObserver(obs3); //改变state状态 sb.setState(233); sout(“obs1观察者状态值为” + obs1.getMyState()); sout(“obs2观察者状态值为” + obs2.getMyState()); sout(“obs3观察者状态值为” + obs3.getMyState());
sb.setState(666);
sout("obs1观察者状态值为" + obs1.getMyState());
sout("obs2观察者状态值为" + obs2.getMyState());
sout("obs3观察者状态值为" + obs3.getMyState());
}
}
```