观察者模式

一、什么是观察者模式

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

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

二、观察者模式的结构

三、观察者模式的角色和职责

Subject(被观察者)

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

ConcreteSubject

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

Observer(观察者)

  接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数的到通知。

ConcreteObserver

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

四、观察者模式的典型应用

  侦听事件驱动程序设计中的外部事件

  侦听/监视某个对象的状态变化

  发布者/订阅者模型中,当一个外部时间(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者。

 

文章实体

 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 }
查看代码

博客用户,被观察者

 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 }
查看代码

订阅者,观察者

 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 }
查看代码

启动类

 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 }
查看代码

 

原文地址:https://www.cnblogs.com/bingoogol/p/DesignPattern-observer.html