介绍
观察者模式实质就是定义对象与依赖(对象)之前的关系(一对多),使得如果当前对象自身发生改变时,就可以自动通知其依赖(对象)让其发生改变
使用场景
消息队列(跨系统信息交互)
角色
Subject:抽象主题(被观察者)ConcreteSubject:抽象主题的实现(被观察者)Observer:观察者接口ConcreteObserver:观察者接口实现(观察者)
入门案例:
UML图解:
代码:
[Subject]
//主题public abstract class Subject { //观察者集合 private Listobservers = new ArrayList<>(); //添加观察者 public void attach(Observer observer){ observers.add(observer); } //移除观察者 public void detach(Observer observer){ observers.remove(observer); } //通知观察者 public void Notify(){ for (Observer observer : observers) { observer.update(); } }}
[ConcreteSubject]
//具体的主题public class MomSubject extends Subject { //主题消息 private String msg; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; }}
[Observer]
public interface Observer { void update();}
[ConcreteObserver]
//具体的观察者public class Son implements Observer { //名字 private String name; //观察的主题 private MomSubject subject; public Son(String name, MomSubject subject) { this.name = name; this.subject = subject; } @Override public void update() { System.out.println(name + "..." + subject.getMsg()); } public String getName() { return name; } public void setName(String name) { this.name = name; } public Subject getSubject() { return subject; } public void setSubject(MomSubject subject) { this.subject = subject; }}
测试
public class Main { public static void main(String[] args){ //创建主题 MomSubject subject = new MomSubject(); //设置观察该主题的观察者 subject.attach(new Son("小强", subject)); subject.attach(new Son("小红", subject)); //设置通知信息 subject.setMsg("吃饭了"); //变动处;做到当主题的msg属性发生改变时,依赖就随之发送变动 //通知观察者更新信息 subject.Notify(); /** * output: * 小强...吃饭了 小红...吃饭了 */ }}