观察者模式

来源:互联网 发布:pc蛋蛋网站源码 编辑:程序博客网 时间:2024/06/01 10:45

一、什么是观察者模式?

    Observer模式是行为模式的一种,在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。    Observer模式提供给关联对象一种同步通信的手段,使某个对象与 依赖它的其他对象之间保持状态同步。 

二、观察模式的角色和职责:

抽象主题角色(subject): 被观察的对象。当被观察者需要发生改变时,通知观察者对象。subject需要维持 一个观察者对象的队列列表。又叫被观察者对象(Observerable)。

具体主题角色(ConcreteSubject): 被观察者的具体实现,包含一些基本属性状态及其他操作。

抽象观察者(Observer)角色: 接口或抽象类。当subject发生改变时,Observer对象将通过一个CallBack函数得到通知。

具体观察者(ConcreteObserver)角色: 观察者的具体实现。得到通知后,将完成一些具体的业务逻辑处理。

三、观察者模式的应用

当抽象个体有两个互相依赖的层面时。封装这些层面在单独的对象内将可允许程序员单独地去变更与重复使用这些对象,而不会产生两者之间交互的问题。

当其中一个对象的变更会影响其他对象,却又不知道多少对象必须被同时变更时。

当对象应该有能力通知其他对象,又不应该知道其他对象的实做细节时。

1、侦听事件驱动程序中的外部事件。
2、侦听/检测某个对象的状态变化。
3、发布者/订阅者模型中,当一个外部事件(新的产品,消息,博文等等)被触发时,通知邮件列表中的订阅者。

四、具体代码:

/**   * @Title: Article.java* @Package com.ObServer* @Description: 被观察类* @author xiaozhi   * @date 2016年12月4日 下午1:05:04* @version V1.0   */package com.ObServer;import java.util.Observable;//继承java.util包中的Observable类。使得该类可以被观察public class Article extends Observable {    private String ArticleTitle;    private String ArticleContext;    public String getArticleTitle() {        return ArticleTitle;    }    public void setArticleTitle(String articleTitle) {        ArticleTitle = articleTitle;        // 当文章标题发生改变,即,对象发生改变的时候,设置该对象发生改变。        this.setChanged();        // 并通知观察者        this.notifyObservers();    }    public String getArticleContext() {        return ArticleContext;    }    public void setArticleContext(String articleContext) {        ArticleContext = articleContext;        // 当文章内容发生改变,即,对象发生改变的时候,设置该对象发生改变。        this.setChanged();        // 并通知观察者        this.notifyObservers();    }}
/**   * @Title: BlogUser.java* @Package com.ObServer* @Description: 被观察者* @author xiaozhi   * @date 2016年12月4日 下午1:04:01* @version V1.0   */package com.ObServer;import java.util.Observable;//继承java.util包中的Observable类。使得该类可以被观察public class BlogUser extends Observable {    public void updateBlog(String articleTitle, String articleContext) {        Article article = new Article();        article.setArticleContext(articleContext);        article.setArticleTitle(articleTitle);        System.out.println("我的博文标题是:" + articleTitle + "。博文内容为:" + articleContext + "大家快来看吧!");        // 当有博文发表时,设置对象被改变        this.setChanged();        // 通知观察者,并传递博文对象        this.notifyObservers(article);    }}
/**   * @Title: MyObServer.java* @Package com.ObServer* @Description: 观察者* @author xiaozhi   * @date 2016年12月4日 下午1:09:07* @version V1.0   */package com.ObServer;import java.util.Observable;import java.util.Observer;//实现java.util包中的Observable接口,通过update方法或者被观察者发送的通知信息public class MyObServer implements Observer {    @Override    public void update(Observable o, Object arg) {        System.out.println("你关注的博主发表新文章啦,快去查看吧!");        // 接受到被观察者发送的博文对象        Article article = (Article) arg;        String a = article.getArticleTitle();        String b = article.getArticleContext();        System.out.println("文章标题为:" + a);        System.out.println("文章内容为:" + b);    }}
/**   * @Title: MainClass.java* @Package com.ObServer* @Description: 测试类* @author xiaozhi   * @date 2016年12月4日 下午1:03:20* @version V1.0   */package com.ObServer;public class MainClass {    public static void main(String[] args) {        BlogUser blogUser = new BlogUser();        // 注册一个观察者        blogUser.addObserver(new MyObServer());        blogUser.updateBlog("我开通了博客,欢迎大家来访问", "欢迎访问,多多交流!");    }}

五、测试结果:

我的博文标题是:我开通了博客,欢迎大家来访问。博文内容为:欢迎访问,多多交流!大家快来看吧!你关注的博主发表新文章啦,快去查看吧!文章标题为:我开通了博客,欢迎大家来访问文章内容为:欢迎访问,多多交流!
0 0