观察者模式与java实现例子
来源:互联网 发布:2017网络自制综艺现状 编辑:程序博客网 时间:2024/04/30 12:10
观察者模式定义
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。根据定义我们可以大概了解到,观察者模式解决的问题是:建立一个一(Subject)对多(Observer)的关系,能够使得当"一"变化的时候,依赖这个"一"的多也能够同步改变。
观察者模式的UML类图以及相应角色介绍
观察者模式的UML类图:
观察者模式所涉及的角色有:
抽象主题(Subject)角色:即被观察者(Observable)的角色,抽象主题角色把所有观察者对象的引用保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
具体主题(ConcreteSubject)角色:即具体被观察者(ConcreteObservable),此角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发出通知。
抽象观察者(Observer)角色:此角色是观察者的抽象类,它定义了一个更新接口,在得到主题的通知时更新自己。
具体观察者(ConcreteObserver)角色:该主题实现抽象观察者角色所定义的更新接口,以便在主题的状态发生变化时更新自身的状态。
观察者模式的简单实现
定期发布新的内容推送给已订阅公众号的微信用户,这种模式叫做订阅——发布模式,是观察者模式使用率很高的场景。此外还有一种常用的应用场景是GUI系统。
/** * 微信用户是具体观察对象 * @author yeoggc * */public class User implements Observer{ private String mName; public User(String name){ this.mName = name; } @Override public void update(Observable o, Object arg) { System.out.println("微信用户:"+mName+",您的微信公众号更新这些内容:"+arg); }}
/** * OfficialAccount(公众号),具体被观察者角色,当它有更新时所有的观察者(这里是微信用户)都会接到相应的通知 * @author yeoggc * */public class OfficialAccount extends Observable{ /** * * @param info 要给观察者的信息 */ public void publishNewInfo(String info){ //标识这个Observable对象已经改变了,更具体来将就是把Observable中属性changed置为true. setChanged(); //在通知所有观察者之前,需要判断Observable中属性changed是否为true,如若不为则不会发出通知。 //具体可以看源码,蛮好理解的。 notifyObservers(info); }
/** * 测试代码 * @author yeoggc * */public class Test { public static void main(String[] args) { //被观察的角色 OfficialAccount officialAccount = new OfficialAccount(); //观察者 User userBob = new User("WeChat User-Bob"); User userTom = new User("WeChat User-Tom"); User userMe = new User("WeChat User-Me"); //将观察者注册到可观察对象的观察者列表中 officialAccount.addObserver(userBob); officialAccount.addObserver(userTom); officialAccount.addObserver(userMe); //发布消息 officialAccount.publishNewInfo("...新内容..."); }}
在JAVA语言的API中,提供了一个Observable抽象类以及一个Observer接口,构成JAVA语言对观察者模式的支持。
User是具体的观察者,他们订阅了OfficialAccount这个具体的可观察对象,当OfficialAccount有更新时,会遍历所有观察者。然后给这些观察者发布一个更新消息,之后User中的update方法会调用,这样就达到了一对多的通知功能。
在这个过程中,通知系统都是依赖Observer和Obserable这些抽象类和接口,因此,对于User和OfficialAccount完全没有耦合,保证了订阅系统的灵活性、和可扩展性。
0 0
- 观察者模式与java实现例子
- 《JAVA与模式》之观察者模式例子
- 观察者模式及Java实现例子
- 观察者模式及Java实现例子
- java观察者模式及实现例子
- 观察者模式及Java实现例子
- 观察者模式及Java实现例子
- 观察者模式及Java实现例子
- 观察者模式及Java实现例子
- 观察者模式及Java实现例子
- 观察者模式及Java实现例子
- 观察者模式及Java实现例子
- Java观察者模式例子
- Java观察者模式例子
- Java 观察者模式 简单例子
- Java实现观察者模式
- Java实现观察者模式
- 观察者模式-java实现
- 集群监控--监控指标
- OpenGL, OpenGL ES, WebGL, GLSL, GLSL ES APIs 列表
- 删除顺序表指定元素
- 用蚕茧表示法写简洁实用的接口文档
- 判断当前界面是否是桌面
- 观察者模式与java实现例子
- HTML5学习---单页面手势滑屏切换原理
- C语言中数组与指针
- PHP学习笔记-流程控制语句
- TCP/IP协议(1)——基础知识(协议与接口)
- Bzoj:[Poi2011]Lightning Conductor:决策单调性优化DP详解
- HTML页面绝对定位+相对定位
- 【bzoj3771】Triple FFT
- c++中指针和引用的区别