设计模式-----观察者模式
来源:互联网 发布:机顶盒电影软件 编辑:程序博客网 时间:2024/06/15 17:26
观察者模式:定义了对象之间一对多的依赖,这样一来,当一个对象的状态改变时它的所有依赖者都会获得更新
1。场景:我是一个新闻推送程序,只要我有新的新闻就会推送给订阅我的用户。
我们来实现这一场景,首先这新闻推送程序是一个主题(subject),而所有的用户是观察者(Observer),他们是一对多的关系。且一旦主题新闻一旦更新,就会将更新的news推送到所有的观察者,订阅者。
2.类结构图
3.实现它上图中的之所以定义一个Subject是因为可能存在多种主题的新闻可共订阅,用户经常订阅一种时间久了会反感,我们可以让用户定义多种主题,目前只做最简单的实现
package com.ysj.www.service;import com.ysj.www.pojo.News;public interface Observer {public void update(News news);}
package com.ysj.www.service;public interface Subject {public void registerObserver(Observer o);public void removeObserver(Observer o);public void notifyObservers();}
package com.ysj.www.pojo;public class News {public News() {// TODO Auto-generated constructor stub}private String title;private String content;private String author;private String time;public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}}
package com.ysj.www.serviceimpl;import com.ysj.www.pojo.News;import com.ysj.www.service.Observer;public class AObserver implements Observer {public void update(News news) {// TODO Auto-generated method stubSystem.out.println("AObserver 开始接受数据");System.out.println("标题:"+news.getTitle());System.out.println("内容:"+news.getContent());System.out.println("作者:"+news.getAuthor());System.out.println("时间:"+news.getTime());}}
package com.ysj.www.serviceimpl;import com.ysj.www.pojo.News;import com.ysj.www.service.Observer;public class BObserver implements Observer {public void update(News news) {System.out.println("BObserver 开始接受数据");System.out.println("标题:"+news.getTitle());System.out.println("内容:"+news.getContent());System.out.println("作者:"+news.getAuthor());System.out.println("时间:"+news.getTime());}}
package com.ysj.www.serviceimpl;import com.ysj.www.pojo.News;import com.ysj.www.service.Observer;public class CObserver implements Observer {@Overridepublic void update(News news) {// TODO Auto-generated method stubSystem.out.println("CObserver 开始接受数据");System.out.println("标题:"+news.getTitle());System.out.println("内容:"+news.getContent());System.out.println("作者:"+news.getAuthor());System.out.println("时间:"+news.getTime());}}
package com.ysj.www.serviceimpl;import java.util.ArrayList;import com.ysj.www.pojo.News;import com.ysj.www.service.Observer;import com.ysj.www.service.Subject;public class NewsSubject implements Subject {private ArrayList<Observer> observers=new ArrayList<Observer>();private News news;@Overridepublic void registerObserver(Observer o) {System.out.println("有用户订阅了");observers.add(o);} @Overridepublic void removeObserver(Observer o) {int i=observers.indexOf(o);if(i>=0){observers.remove(i);}}/** * 通知观察者 */@Overridepublic void notifyObservers() {// TODO Auto-generated method stubfor(int i=0;i<observers.size();i++){Observer observer=(Observer) observers.get(i);observer.update(news);}}/** * 新闻更新了 * *下午10:46:37 *void* */public void newsChanged(){notifyObservers();}/** * 更新新闻 * @param news *下午10:45:47@param news *void* */public void setNews(News news) {this.news = news;newsChanged();}}
<span style="font-size:14px;"><strong>package com.ysj.www.test;import com.ysj.www.pojo.News;import com.ysj.www.serviceimpl.AObserver;import com.ysj.www.serviceimpl.BObserver;import com.ysj.www.serviceimpl.CObserver;import com.ysj.www.serviceimpl.NewsSubject;public class ObserverModeTest {/** * @param args *下午10:52:10@param args *void * */public static void main(String[] args) {//创建主题对象 NewsSubject subject=new NewsSubject(); //创建观察者ABC AObserver aObserver=new AObserver(); BObserver bObserver=new BObserver(); CObserver cObserver=new CObserver(); //观察者订阅主题 subject.registerObserver(aObserver); subject.registerObserver(bObserver); subject.registerObserver(cObserver); //主题对象发布新的新闻 News news=new News(); news.setTitle("推送新新闻了"); news.setAuthor("主题对象"); news.setContent("观察这模式就是这么简单,学会了吗?"); news.setTime("2016-04-27 23:00"); subject.setNews(news); }}</strong></span>
执行结果:
有用户订阅了有用户订阅了有用户订阅了AObserver 开始接受数据标题:推送新新闻了内容:观察这模式就是这么简单,学会了吗?作者:主题对象时间:2016-04-27 23:00BObserver 开始接受数据标题:推送新新闻了内容:观察这模式就是这么简单,学会了吗?作者:主题对象时间:2016-04-27 23:00CObserver 开始接受数据标题:推送新新闻了内容:观察这模式就是这么简单,学会了吗?作者:主题对象时间:2016-04-27 23:00
0 0
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- 设计模式-观察者模式
- 设计模式-【观察者模式】
- 设计模式-观察者模式
- 设计模式 -- 观察者模式
- 设计模式-观察者模式
- 【设计模式】观察者模式
- 设计模式- 观察者模式
- 设计模式- 观察者模式
- 设计模式--观察者模式
- recv和read阻塞和非阻塞
- Java:使用synchronized和Lock对象获取对象锁
- 分布式系统延迟和容错框架Hystrix
- VS2010写WORD(二)表格操作
- HDU 2008 数值统计(大水题)
- 设计模式-----观察者模式
- POJ_1700_Crossing River
- HDU5606 tree 无向图 dfs求联通块
- 笔试题39. LeetCode OJ (26)
- 物联网底层开发现状
- Spark组件之Spark Streaming学习3--结合SparkSQL的使用(wordCount)
- PHP操作读取超大文件的FileReader类
- el表达式和 三种跳转
- RegExp 正则表达式 方法 详解