本文主要是利用java.util包里面的Observable和Observer来编写监听者模式的代码,仅仅是为了练手而已.
以新华网发布新闻,然后新浪和百度作为监听者跟随播报新闻为例,
下面贴一下代码和类图
1 代码示例
1.1 Subject:被监听者
只要继承Observable即可,无需其他操作
package observer.practice_02;
import java.util.Observable;
/**
* @author yi qiang
* @date 2021/6/17 0:22
*/
public class NewsAgency extends Observable {
//新闻
private String news;
//新华社更新新闻,并通知监听者跟随播报新闻
public void updateNews(String news){
this.news=news;
change();
}
public void change(){
setChanged();
notifyObservers();
}
public String getNews() {
return news;
}
}
1.2 Observer: 监听者
只要实现Observer即可,无需其他操作
//百度
public class Baidu implements Observer {
@Override
public void update(Observable o, Object arg) {
NewsAgency data=(NewsAgency)o;
System.out.println("Baidu 播报新闻 ==> "+data.getNews());
}
}
//新浪
public class Sina implements Observer {
@Override
public void update(Observable o, Object arg) {
NewsAgency data=(NewsAgency)o;
System.out.println("Sina 播报新闻 ==> "+data.getNews());
}
}
1.3 Client:调用者
public class Client {
public static void main(String[] args) {
NewsAgency newsAgency=new NewsAgency();
Baidu baidu = new Baidu();
//添加监听者
newsAgency.addObserver(new Sina());
newsAgency.addObserver(baidu);
newsAgency.updateNews("早间新闻");
System.out.println();
//更新新闻
newsAgency.updateNews("午间新闻");
System.out.println();
//移除监听者
newsAgency.deleteObserver(baidu);
System.out.println();
newsAgency.updateNews("晚间新闻");
}
}
调用结果:
Baidu 播报新闻 ==> 早间新闻
Sina 播报新闻 ==> 早间新闻
Baidu 播报新闻 ==> 午间新闻
Sina 播报新闻 ==> 午间新闻
Sina 播报新闻 ==> 晚间新闻
2 类图
自动生成的类图,勉强也可以看得清楚逻辑