0
点赞
收藏
分享

微信扫一扫

设计模式二之观察者模式


定义

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。就是发布者–订阅者的关系。 –学自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("张三摇身一变成赌神","大家好,才是真滴好,广州好滴");
}
}​​

输出信息:

今日快报->头条:张三摇身一变成赌神,广告:大家好,才是真滴好,广州好滴


举报

相关推荐

0 条评论