设计模式-观察者模式(Observer)
观察者模式是行为模式的一种,它的作用是当一个对象的状态发生变化时,能够自动通知关联对象,自动刷新对象状态。
观察者模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。
角色和职责:
1.被观察者(Observable)-Observable:
被观察者对象,当需要被观察者的状态发生变化时,需要通知队列中所有观察者对象。Subscribe需要维持(添加,删除,通知)一个观察者对象的队列列表。
2.被观察者具体实现(Concrete Observable)-Subscibe:
被观察者具体实现,包含一些基本的属性状态及其他操作
3.观察者(Observer)-Observer:
当subscribe状态发生变化时,Observer对象将通过一个callback函数得到通知
4.观察者具体实现(Concrete Observer)-Observer1、Observer2:
观察者具体实现,得到通知后将完成一些具体的业务逻辑处理
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 Subscribe 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("圆是一个圆圈。。。"); Subscribe subscribe= new Subscribe();//订阅号 subscribe.addObserver(new Observer1());//订阅者1 subscribe.addObserver(new Observer2());//订阅者2 subscribe.insertArticle(article);//订阅号新增一篇文章 } }
结果:
新增一篇文章
订阅者2,收到订阅号的通知
标题:圆周率的实现,内容:圆是一个圆圈。。。
订阅者1,收到订阅号的通知
标题:圆周率的实现,内容:圆是一个圆圈。。。
应用场景:
- 倾听事件驱动程序设计中的外部事件
- 监听某个对象的状态变化
- 发布者/订阅者模型中,当一个外部被触发时,通知邮件列表中的订阅者
源码地址:https://github.com/qjm201000/design_pattern_observer.git