概念
- 行为模型关注对象间的交互,解决通信和协作,进一步明确对象的职责。
观察者又叫发布订阅。定义对象间一对多的依赖关系,当一个对象改变,所有依赖他的对象都会得到通知并更新。
实现方式
推:把通知以广播方式发给观察者,观察者只能被动接收。
拉:观察者只需要知道什么时候变了,什么时候拉去内容,什么内容,自主决定。
应用场景
关联行为场景,可拆分的关联。时间多级触发场景。
- 跨系统的消息交互场景,消息队列、事件总线的处理机制。
实现
```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());}
}
```
