1.介绍
观察者模式定义了一种一对多的关系,一个被观察者可以被多个观察者监听,并且
可以拥有添加或删除观察者的功能。当被观察者的状态发生改变时,将会通知所有
监听它的观察者。
2.结构
(1)抽象的被观察者
定义一个观察者的接口或抽象类,其中有新增、删除以及通知所有观察者的方法定义。
(2)抽象的观察者
定义观察者接收到监听对象的更新状态之后执行的动作的方法
(3)具体的被观察者
实现新增、删除以及通知所有观察者的方法定义,添加观察者对象的集合作为成员变量。
(4)具体的观察者
实现接收到监听对象的更新状态之后执行的动作的方法
3.实例
我们这里实现一个模拟微博频道订阅的模式的样例,被观察者是某热门微博频道,观察者是订阅该频道的其它用户。
首先我们先创建一个观察者的接口Observer:
package cn.com.observer.test;
public interface Observer {
public void Update(String str);
}
其中定义了监听对象的更新状态之后执行的动作的方法
然后创建一个被观察者的接口Observed:
package cn.com.observer.test;
public interface Observed {
public void addObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers(String str);
}其中有新增、删除以及通知所有观察者的方法定义
接着我们实现具体的观察者,新建MicroBlogUser(微博用户)类,实现Observer接口,实现
update方法,来编写当观察者接收到监听对象的更新状态之后执行的动作的逻辑:
package cn.com.observer.test;
public class MicroBlogUser implements Observer {
//观察者用户名
private String username;
//设置用户名
public void setUsername(String username) {
this.username = username;
}
//接收到监听对象的更新状态之后执行的动作
public void Update(String str) {
//打印监听到的信息
System.out.println(this.username+"接收到了以下信息:"+str);
}
}然后实现具体的被观察者,新建NewsChannel(新闻频道)类,实现Observed接口,实现了
addObserver、removeObserver以及notifyObservers方法,并添加了一个保存所有观察
者的List集合作为其成员变量:
package cn.com.observer.test;
import java.util.ArrayList;
import java.util.List;
public class NewsChannel implements Observed {
//所有的观察者集合
private List<Observer> microBlogUsers = new ArrayList<Observer>();
//添加观察者
public void addObserver(Observer observer) {
microBlogUsers.add(observer);
}
//删除观察者
public void removeObserver(Observer observer) {
microBlogUsers.remove(observer);
}
//通知所有观察者
public void notifyObservers(String str) {
for(int i=0;i<microBlogUsers.size();i++){
microBlogUsers.get(i).Update(str);
}
}
}最后我们编写测试类,让张三、李四和王五订阅该新闻频道,然后新闻频道已发出新的新闻,
所有订阅者都会收到新闻信息:
package cn.com.observer.test;
public class ObserverTest {
public static void main(String[] args) {
//创建三个观察者并为其命名
MicroBlogUser zhangSan = new MicroBlogUser();
MicroBlogUser liSi = new MicroBlogUser();
MicroBlogUser wangWu = new MicroBlogUser();
zhangSan.setUsername("张三");
liSi.setUsername("李四");
wangWu.setUsername("王五");
//创建一个被观察者
NewsChannel newsChannel = new NewsChannel();
//为其设置观察者
newsChannel.addObserver(zhangSan);
newsChannel.addObserver(liSi);
newsChannel.addObserver(wangWu);
//创建新闻
String news="市人民公园举行活动";
//通知所有观察者
newsChannel.notifyObservers(news);
}
}运行测试代码,得到结果:
以上就是观察者模式的结构以及实现,比较适用于一些一对多具有传播类型的功能
转载请注明出处:http://blog.csdn.net/acmman/article/details/71158353