定义
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。就是发布者–订阅者的关系。 –学自headFirst 设计模式
实例
我这里举在报刊订报的例子
订报需要
- 角色:
发布者(报社)
、订阅者(消费者)
- 业务处理:
- 发布者:
注册(订报)
、取消(退订)
、通知(送报)
- 订阅者:
显示内容(看报)
、更新内容(查看报箱)
代码实现
上面我们大概写了相关的角色与行为,想在将他们解析成代码
发布者接口
分别对应订报、退订、送报操作
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
订阅者接口
两个接口分别对应 看报、查看报箱
public interface DisplayElement {
// 内容显示调用 看报
public void display();
}
public interface Observer {
//内容更新调用 查看报箱 args分别为 头条与广告
public void update(String headline,String ad);
}
上面各接口已经弄好了,接下来我们要做的是继承他们
继承接口
发布者继承
public class JournalData implements Subject{
private ArrayList observers;
private String headline; //头条
private String ad; //广告
public JournalData(){
observers = new ArrayList(); //实例化动态数组,相当于C的链表
}
@注册观察者(订报)
public void registerObserver(Observer o) {
// 添加观察者
observers.add(o);
}
@消费者退订
public void removeObserver(Observer o) {
// 返回某字符在字符串首次出现的位置
int i = observers.indexOf(o);
if(i > 0){
observers.remove(o);
}
}
@实时更新送报
public void notifyObserver() {
for (int i = 0; i < observers.size(); i++) {
//获取每一个节点并对每一个观察者进行更新 提醒送报操作
Observer observer = (Observer)observers.get(i);
observer.update(heading,ad);
}
}
public void messurementsChanged(){
notifyObserver();
}
public void setMeasurements(String headling,String ad){
this.headline= headline;
this.ad= ad;
messurementsChanged();
}
}
订阅者继承
public class Subscriber implements Observer,DisplayElement{
private String headline; //头条内容
private String ad; //广告内容
public Subscriber (Subject JournalData){
this.JournalData = JournalData;
//使用上转型并使用继承的注册方法
JournalData .registerObserver(this);
}
@Override
public void display() {
System.out.println("今日快报->头条:"+headline+",广告"+ad);
}
@Override
public void update(String headline,String ad) {
// 继承更新方法 定时送报
this.headline = headline;
this.ad= ad;
//在头条与广告弄好之后就显示出来
display();
}
}
现在上面组件都搭好了,我们运行试试
public class Test{
public static void main(String[] args) {
// TODO Auto-generated method stub
JournalData data = new JournalData();
Subscriber subscriber = new Subscriber(data);
data.setMeasurements("张三摇身一变成赌神","大家好,才是真滴好,广州好滴");
}
}
输出信息:
今日快报->头条:张三摇身一变成赌神,广告:大家好,才是真滴好,广州好滴