观察者模式

一曲冷凌霜 提交于 2019-11-28 15:26:27

观察者模式

定义

对象之间定义一对多的依赖,当这个对象状态发生变化,它所依赖的对象都能得到变化后的状态值。(简单的来说,就类似消息系统的发布订阅模式。其中消息系统中的消费者就是观察者,消息系统中的生产者就是被观察者。当生产者的状态发生变化,那么订阅该消息的消费者就将全部接收到变化的信息)

类图

说明

由UML可以看出,该模式由四个对象组成:

  • 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
  • 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
  • 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
  • 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。

代码实现

  1. Subject
public interface Subject {     void initMsg(String msg);     public void addObserver(Observer observer);      public void removeObserver(Observer observer);      public void notifyObserver(); }
  1. Observer
public interface Observer {     public void updateMsg(String msg); }
  1. MsgSubject
public class MsgSubject implements Subject {     private List<Observer> observerList = new ArrayList<>();     private String msg;      @Override     public void initMsg(String msg) {         this.msg = msg;         System.out.println("收到消息:" + this.msg);         // 通知观察者         this.notifyObserver();      }      @Override     public void addObserver(Observer observer) {         this.observerList.add(observer);      }      @Override     public void removeObserver(Observer observer) {         this.observerList.remove(observer);     }      @Override     public void notifyObserver() {         observerList.forEach(o -> {             o.updateMsg(this.msg);         });      }
  1. MsgObserver
public class MsgObserver implements Observer {     private String userName;      public MsgObserver(String userName) {         this.userName = userName;     }      @Override     public void updateMsg(String msg) {         System.out.println(userName + "收到消息: " + msg);     }      public int hashCode() {         return super.hashCode();     }      public boolean equals(Object obj) {         return super.equals(obj);     }      public String toString() {         return super.toString();     } }
  1. 测试
public static void main(String[] args) {         Observer observer = new MsgObserver("a");         Observer observer1 = new MsgObserver("b");         Observer observer2 = new MsgObserver("c");         Subject subject = new MsgSubject();         subject.addObserver(observer);         subject.addObserver(observer1);         subject.addObserver(observer2);         subject.initMsg("sds");         subject.removeObserver(observer1);         subject.initMsg("adsd");     }


收到消息:sds a收到消息: sds b收到消息: sds c收到消息: sds 收到消息:adsd a收到消息: adsd c收到消息: adsd
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!