设计模式之观察者模式

来源:互联网 发布:卫生间地面材料 知乎 编辑:程序博客网 时间:2024/05/07 14:09

如有转载,请申明:

转载至 http://blog.csdn.net/qq_35064774/article/details/52080134


1 什么是观察者模式

 

观察者模式是对象的行为模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。

 

这个定义也有些抽象,简单来说,就是类似于订阅报纸系统,每当报社有新闻时,就会给订阅的用户推送。

 

 

2 如何实现观察者模式

同样以一个简单的问题作为入口。

 

 * 现有一个新闻订阅系统,只要是订阅了的用户,在发布新的新闻时,都会收到通知

 

这是很明显的观察者模式应用情形。

在写代码之前,首先要知道一点,java提供了对观察者模式的支持。它给开发者提供了一个Observable类和Observer接口。

 

首先我们定义一个新闻订阅系统。

 

package com.ittianyu.observer;import java.util.Observable;public class NewsSubscribeSystem extends Observable {private String news = "";protected String getNews() {return news;}protected void setNews(String news) {this.news = news;}public void publish(String news) {if (!this.getNews().equals(news)) {this.setNews(news);this.setChanged();}this.notifyObservers(news);}}


 

这个类继承了Observable类。同时提供了publish方法,来方便的发布新的新闻,只要是没发布过的新闻,我们就先调用setChanged来表明类内部状态已经改变,这时候再调用notifyObservers时,就会通知所有订阅用户。

 

然后我们定义用户类。

 

package com.ittianyu.observer;import java.util.Observable;import java.util.Observer;public class User implements Observer {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public User(NewsSubscribeSystem subscribeSystem, String name) {subscribeSystem.addObserver(this);this.setName(name);}@Overridepublic void update(Observable o, Object arg) {System.out.println("Hello " + this.getName() + "! This is the news that you subscribe to.\n" + arg);}}



用户类实现了observer接口,接口中有一个方法update。这个方法是在被观察者状态变化发出通知时,调用的方法。这个方法有个arg参数,这里我们传的是新闻,所以这里直接就用来输出了。

 

最后是测试类。

 

package com.ittianyu.observer;public class Test {public static void main(String[] args) {NewsSubscribeSystem subscribeSystem = new NewsSubscribeSystem();User user1 = new User(subscribeSystem, "Mike");User user2 = new User(subscribeSystem, "Bob");User user3 = new User(subscribeSystem, "Jone");subscribeSystem.publish("今日头条 xxxx");}}


 

测试结果为:

Hello Jone! This is the news that you subscribe to.

今日头条 xxxx

Hello Bob! This is the news that you subscribe to.

今日头条 xxxx

Hello Mike! This is the news that you subscribe to.

今日头条 xxxx

 

 

3 在什么情况下使用观察者模式

 

 * 对象之间有一对多的依赖关系,且当“一”的对象改变时,其他对象需要知道这一改变发生了。

 

4 观察者模式的优点和缺点

 

优点:

 * 观察者模式在被观察者和观察者之间建立一个抽象的耦合。

 * 支持广播通讯。

 

 

缺点:

 * 如果被观察者对象有很多直接或间接的观察者的话,通知所有观察者将花费很多时间。

 * 如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。

1 0
原创粉丝点击