一、什么是观察者模式
观察者模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
观察者模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。
二、观察者模式的结构
三、观察者模式的角色和职责
Subject(被观察者)
被观察者对象。当需要被观察者的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
ConcreteSubject
被观察者的具体实现。包含一些基本的属性状态及其他操作。
Observer(观察者)
接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数的到通知。
ConcreteObserver
观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。
四、观察者模式的典型应用
侦听事件驱动程序设计中的外部事件
侦听/监视某个对象的状态变化
发布者/订阅者模型中,当一个外部时间(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者。
文章实体
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.bingoogol.designpattern.observer;
2
3 /**
4 * 文章实体
5 *
6 * @author bingoogol@sina.com
7 */
8 public class Article {
9 private String title;
10 private String content;
11
12 public Article() {
13 }
14
15 public Article(String title, String content) {
16 this.title = title;
17 this.content = content;
18 }
19
20 public String getTitle() {
21 return title;
22 }
23
24 public void setTitle(String title) {
25 this.title = title;
26 }
27
28 public String getContent() {
29 return content;
30 }
31
32 public void setContent(String content) {
33 this.content = content;
34 }
35
36 }
博客用户,被观察者
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.bingoogol.designpattern.observer;
2
3 import java.util.Observable;
4
5 /**
6 * 博客用户,被观察者
7 *
8 * @author bingoogol@sina.com
9 */
10 public class BlogUser extends Observable{
11
12 private String name;
13
14
15 public BlogUser() {
16 }
17 public BlogUser(String name) {
18 this.name = name;
19 }
20
21 public void publish() {
22 Article article = new Article("观察者模式", "模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态");
23 System.out.println("博主:" + name + " 发布文章");
24 System.out.println("文章标题:" + article.getTitle());
25 System.out.println("文章内容:" + article.getContent());
26 System.out.println("---------------------------------------------------------------");
27 this.setChanged();
28 this.notifyObservers(article);
29 }
30
31 public String getName() {
32 return name;
33 }
34
35 public void setName(String name) {
36 this.name = name;
37 }
38 }
订阅者,观察者
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.bingoogol.designpattern.observer;
2
3 import java.util.Observable;
4 import java.util.Observer;
5
6 /**
7 * 订阅者,观察者
8 *
9 * @author bingoogol@sina.com
10 */
11 public class MyObServer implements Observer {
12 private String name;
13
14 public MyObServer() {
15 }
16
17 public MyObServer(String name) {
18 this.name = name;
19 }
20
21 @Override
22 public void update(Observable o, Object arg) {
23 Article article = (Article) arg;
24 BlogUser blogUser = (BlogUser) o;
25 System.out.println("订阅者:" + name + " 收到" + blogUser.getName() + "的文章");
26 System.out.println("文章标题:" + article.getTitle());
27 System.out.println("文章内容:" + article.getContent());
28 System.out.println("---------------------------------------------------------------");
29 }
30
31 public String getName() {
32 return name;
33 }
34
35 public void setName(String name) {
36 this.name = name;
37 }
38
39 }
启动类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.bingoogol.designpattern.observer;
2
3 /**
4 * 启动类
5 *
6 * @author bingoogol@sina.com
7 */
8 public class Main {
9 public static void main(String[] args) {
10 MyObServer obServer1 = new MyObServer("订阅者1");
11 MyObServer obServer2 = new MyObServer("订阅者2");
12 BlogUser blogUser = new BlogUser("博主1");
13 blogUser.addObserver(obServer1);
14 blogUser.addObserver(obServer2);
15 blogUser.publish();
16 }
17 }