您的位置:首页 > 其它

观察者模式

2016-04-15 19:54 281 查看
定义:观察者模式定义了对象之间的一对多的依赖,当一个对象改变状态时,其他的依赖者都会收到通知。

定义中的“一”指的是“主题对象”,“多”指的是“观察者”,通俗的说就是当主题对象中状态(数据,信息等)改变了,就会通知观察者主题改变了状态,接下来观察者就可以更新信息了。

请看观察者模式的类图



现在互联网非常发达,手机上下载个新闻类的app就可以随时阅读新闻,获取最新的咨询。但是在以前,我们看新闻是从报纸上获取的,我们只要向出版社订阅报纸,每天就会收到报纸。

这里出版社就是“主题”,订阅报纸的人就是“观察者”(订阅报纸的人可以很多),只要出版社出了新报纸,就会主动的给订阅的人送去。我们也可以取消订阅,取消以后就不会收到出版社的报纸了。

首先,开始主题接口和观察者接口。

package com.zengfeng.observer;

//主题接口
public interface Subject {
//注册观察者
public void registerObserver(Observer o);
//移除观察者
public void removeObserver(Observer o);
//通知观察者
public void notifyObservers();
}


package com.zengfeng.observer;
//观察者接口
public interface Observer {

//更新新闻
public void update(New news);
}


package com.zengfeng.observer;

//新闻类
public class New {

//标题
private String title;
//内容
private String content;
//作者
private String autor;

public New(String title,String content,String autor) {
this.title=title;
this.content=content;
this.autor=autor;
}

@Override
public String toString() {
return "New [\n title=" + title + ",\n content=" + content + ", \n autor=" + autor + "]";
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}

public String getAutor() {
return autor;
}

public void setAutor(String autor) {
this.autor = autor;
}

}


接下来是出版社实现类

package com.zengfeng.observer;

import java.util.ArrayList;

//出版社主题
public class PressSubject implements Subject{
//观察者,实现一对多
private ArrayList<Observer> observers;
private New news;

public PressSubject() {
observers=new ArrayList<>();
}

//注册观察者
@Override
public void registerObserver(Observer o) {
observers.add(o);
}

//删除观察者
@Override
public void removeObserver(Observer o) {
int i=observers.indexOf(o);
if(i>=0)
observers.remove(i);
}

//通知观察者
@Override
public void notifyObservers() {
for(Observer observer:observers){
observer.update(news);
}
}

//当新闻更新时,通知观察者
public void NewsChange(New news){
this.news=news;
notifyObservers();
}

}


观察者实现类

package com.zengfeng.observer;
//观察者一
public class OneObserver implements Observer{

//主题
private Subject subject;

public OneObserver(Subject subject) {
this.subject=subject;
subject.registerObserver(this);
}

//更新方式
public void update(New news) {
public void update(New news) {
System.out.println("观察者OneObserver,接收新闻:"+news+" ,我喜欢看这条新闻。");
}
;
}

}


package com.zengfeng.observer;
//观察者二
public class TwoObserver implements Observer{

//主题
private Subject subject;

public TwoObserver(Subject subject) {
this.subject=subject;
subject.registerObserver(this);
}

//更新方式
public void update(New news) {
System.out.println("观察者TwoObserver,接收新闻:"+news+" ,这条新闻有点有趣。");
}

}


上述代码可以看出,主题出版社负责产出新闻,维护它的所有使用者,将产出的新闻,通知给使用者,使用者获得新闻后,怎么处理就由使用者决定,与主题没有关系。

测试代码

package com.zengfeng.observer;

public class ObserverTest {

public static void main(String[] args) {
//主题
PressSubject press=new PressSubject();
//观察者
Observer oneObserver=new OneObserver(press);
Observer twoObserver=new TwoObserver(press);

press.NewsChange(new New("习近平:不断提高人民群众安全感幸福感",
"在4月15日首个全民国家安全教育日到来之际........","新华社北京4月14日电"));
System.out.println("-----------------------------------------");
press.NewsChange(new New("颜值爆表会撒娇 中科大发布首款交互美女机器人",
"4月15日上午,中科大正式发布我国首台特有体验交互机器人“佳佳”......","未知"));

}
}


测试结果



好了,恭喜你又掌握了一个设计模式,以后就可以大展身手了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: