Java设计模式之观察者模式(发布/订阅模式)
2018-01-31 21:28
681 查看
1、概述
观察者模式又称为发布/订阅(Publish/Subscribe)模式观察者设计模式涉及到两种角色:主题(Subject)和观察者(Observer)
(1)Subject模块
Subjec模块有3个主要操作
addObserver():注册添加观察者(申请订阅)
deleteObserver():删除观察者(取消订阅)
notifyObserver():主题状态发生变化时通知所有的观察者对象
(2)Oserver模块
Oserver模块有1个核心操作update(),当主题Subject状态改变时,将调用每个观察者的update()方法,更新通知。
(3)UML图
https://www.processon.com在线画的UML图
2、简单样例
(1)主题接口package observer; public interface Subject { //添加观察者 void addObserver(Observer obj); //移除观察者 void deleteObserver(Observer obj); //当主题方法改变时,这个方法被调用,通知所有的观察者 void notifyObserver(); }
(2)观察者接口
package observer; public interface Observer { //当主题状态改变时,更新通知 public void update(int version); }
(3)主题实现类,某某杂志
package observer; import java.util.ArrayList; import java.util.List; public class MagazineSubject implements Subject{ //存放订阅者 private List<Observer> observers=new ArrayList<Observer>(); //期刊版本 private int version; @Override public void addObserver(Observer obj) { observers.add(obj); } @Override public void deleteObserver(Observer obj) { int i = observers.indexOf(obj); if(i>=0){ observers.remove(obj); } } @Override public void notifyObserver() { for(int i=0;i<observers.size();i++){ Observer o=(Observer)observers.get(i); o.update(version); } } //该杂志发行了新版本 public void publish(){ //新版本 this.version++; //信息更新完毕,通知所有观察者 notifyObserver(); } }
(4)观察者实现类
package observer; public class CustomerObserver implements Observer{ //订阅者名字 private String name; private int version; public CustomerObserver(String name){ this.name = name; } @Override public void update(int version) { this.version=version; System.out.println("该杂志出新版本了"); this.buy(); } public void buy(){ System.out.println(name+"购买了第"+version+"期的杂志!"); } }
(5)测试类
package observer; public class Main{ public static void main(String[] args) { //创建主题(被观察者) MagazineSubject magazine = new MagazineSubject(); //创建三个不同的观察者 CustomerObserver a = new CustomerObserver("A"); CustomerObserver b = new CustomerObserver("B"); CustomerObserver c = new CustomerObserver("C"); //将观察者注册到主题中 magazine.addObserver(a); magazine.addObserver(b); magazine.addObserver(c); //更新主题的数据,当数据更新后,会自动通知所有已注册的观察者 magazine.publish(); } }
执行结果
该杂志出新版本了 A购买了第1期的杂志! 该杂志出新版本了 B购买了第1期的杂志! 该杂志出新版本了 C购买了第1期的杂志!
3、大数据运维平台中的观察者模式
相关文章推荐
- java设计模式-观察者(发布-订阅)模式
- Java 设计模式之观察者模式(发布/订阅模式)
- java笔记--设计模式之观察者(订阅/发布)模式
- 我理解的设计模式:观察者模式(订阅发布模式)
- JS设计模式 - 观察者模式与发布/订阅模式
- 设计模式--观察者模式(发布订阅模式)
- 设计模式(三):观察者模式与发布/订阅模式区别
- javascript设计模式学习之八_发布订阅(观察者)模式
- 十六 设计模式之观察者模式(发布订阅模式)
- 设计模式二:观察者模式(发布订阅模式)
- 设计模式初探-观察者模式(OBSERVER)又称发布-订阅(Publish-Subscribe)依赖(Dependents)
- 设计模式(三)观察者模式Observer(发布订阅)
- 【GOF23设计模式】_观察者模式_广播机制_消息订阅_网络游戏对战原理_自带类与接口JAVA251-252
- js设计模式中发布与订阅实现观察者模式例子
- 设计模式之观察者模式(发布-订阅模式publish/Subscribe)
- 设计模式-观察者模式(发布订阅模式)
- 设计模式--观察者模式(发布订阅模式)
- 【JAVA设计模式-第四课】观察者模式-屌丝求职记+新闻订阅
- 学习javascript设计模式之发布-订阅(观察者)模式
- 设计模式(二)观察者模式和发布订阅模式(Observer)