观察者模式

mac2022-06-30  112

观察者模式

定义

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

类图

说明

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

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

代码实现

Subject public interface Subject { void initMsg(String msg); public void addObserver(Observer observer); public void removeObserver(Observer observer); public void notifyObserver(); } Observer public interface Observer { public void updateMsg(String msg); } 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); }); } 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(); } } 测试 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

转载于:https://www.cnblogs.com/KevinStark/p/11412338.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)