设计模式-观察者模式(Observer)

观察者模式是行为模式的一种,它的作用是当一个对象的状态发生变化时,能够自动通知关联对象,自动刷新对象状态。

观察者模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。

角色和职责:

1.被观察者(Observable)-:

   被观察者对象,当需要被观察者的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。

2.被观察者具体实现(Concrete Observable)-:

    被观察者具体实现,包含一些基本的属性状态及其他操作

3.观察者(Observer):

    当subject状态发生变化时,Observer对象将通过一个callback函数得到通知

4.观察者具体实现Concrete Observer):

    观察者具体实现,得到通知后将完成一些具体的业务逻辑处理

UML图:

具体代码:

/**
 * 文章
 */
public class Article {
    private String articleTitle;//文章标题
    private String articleContent;//文章内容

    public String getArticleTitle() {
        return articleTitle;
    }

    public void setArticleTitle(String articleTitle) {
        this.articleTitle = articleTitle;
    }

    public String getArticleContent() {
        return articleContent;
    }

    public void setArticleContent(String articleContent) {
        this.articleContent = articleContent;
    }
}
import java.util.Observable;

/**
 * 订阅号
 */
public class Subject extends Observable {
    /**
     * 新增文章
     */
    public void insertArticle(Article article){
        //新增一篇文章
        System.out.println("新增一篇文章");
        this.setChanged();//观察者模式标记已更改
        this.notifyObservers(article);//告诉订阅者,这边的通知是依次通知
    }

}
import java.util.Observable;
import java.util.Observer;

/**
 * 订阅者1
 */
public class Observer1 implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("订阅者1,收到订阅号的通知");
        Article article = (Article)arg;
        System.out.println("标题:"+article.getArticleTitle()+",内容:"+article.getArticleContent());
    }
}
import java.util.Observable;
import java.util.Observer;

/**
 * 订阅者2
 */
public class Observer2 implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("订阅者2,收到订阅号的通知");
        Article article = (Article)arg;
        System.out.println("标题:"+article.getArticleTitle()+",内容:"+article.getArticleContent());
    }
}
public class Main {
    public static void main(String[] args) {
        Article article = new Article();
        article.setArticleTitle("圆周率的实现");
        article.setArticleContent("圆是一个圆圈。。。");

        Subject subject = new Subject();//订阅号
        subject.addObserver(new Observer1());//订阅者1
        subject.addObserver(new Observer2());//订阅者2
        subject.insertArticle(article);//订阅号新增一篇文章
    }
}

 结果:

新增一篇文章
订阅者2,收到订阅号的通知
标题:圆周率的实现,内容:圆是一个圆圈。。。
订阅者1,收到订阅号的通知
标题:圆周率的实现,内容:圆是一个圆圈。。。

应用场景:

  • 倾听事件驱动程序设计中的外部事件
  • 监听某个对象的状态变化
  • 发布者/订阅者模型中,当一个外部被触发时,通知邮件列表中的订阅者

源码地址:https://github.com/qjm201000/design_pattern_observer.git

猜你喜欢

转载自www.cnblogs.com/qjm201000/p/10063735.html