设计模式-----观察者模式

来源:互联网 发布:机顶盒电影软件 编辑:程序博客网 时间: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
原创粉丝点击