概念

  • 行为模型关注对象间的交互,解决通信和协作,进一步明确对象的职责。
  • 观察者又叫发布订阅。定义对象间一对多的依赖关系,当一个对象改变,所有依赖他的对象都会得到通知并更新。

    实现方式

  • 推:把通知以广播方式发给观察者,观察者只能被动接收。

  • 拉:观察者只需要知道什么时候变了,什么时候拉去内容,什么内容,自主决定。

    应用场景

  • 关联行为场景,可拆分的关联。时间多级触发场景。

  • 跨系统的消息交互场景,消息队列、事件总线的处理机制。

    实现

    ```java //观察者接口,存放观察者共有的方法 public interface Observer{ void update(int state); }

//定义具体观察者 public class ObserverImpl implement Observer{

  1. private int myState;
  2. public void update(int state){
  3. myState = state;
  4. sout("收到消息,更新数据");
  5. }
  6. public int get MyStat(){
  7. return myState;
  8. }

}

//定义主题、以及观察者数组、实现增删和通知 public class Subject{ //线程安全 private CopyOnWriteArrayList list = new CopyOnWriteArrayList<>();

  1. //注册观察者方法
  2. public void registerObserver(Observer obs){
  3. list.add(obs);
  4. }
  5. //删除观察者方法
  6. public void removeObserver(Observer obs){
  7. list.remove(obs);
  8. }
  9. //通知所有观察者更新
  10. public void notifyAllObserver(int state){
  11. for(Observer ob: list){
  12. ob.update(satate);
  13. }
  14. }

}

//具体主题 public class RealSub extends Subject{

  1. private int state;
  2. public int getState(){
  3. return state;
  4. }
  5. public void setState(int state){
  6. this.state=state;
  7. //主题对象(目标对象)值发生改变
  8. this.notifyAllObserver(state);
  9. }

}

//测试 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());

  1. sb.setState(666);
  2. sout("obs1观察者状态值为" + obs1.getMyState());
  3. sout("obs2观察者状态值为" + obs2.getMyState());
  4. sout("obs3观察者状态值为" + obs3.getMyState());
  5. }

}

```