观察者模式(发布-订阅模式)一个简单的使用
简介
观察者模式(有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。(来源百度百科)
例子
观察者模式他类似于发布-订阅模式,通过一方的改变去通知改变另一方的改变,好比微信公众号,我们通过关注某个微信公众号,当公众号发布文章时,我们就会收到通知,看到文章内容,JDK的java.util包提供了两个类Observer、Observable
现在瞧瞧下面的小栗子:
被监听者(被观察者)
/**
* 公众号 -- 被监听者(被观察者)
*/
public class OfficeObServable extends Observable {
// 公众号名
private String name;
public OfficeObServable(String name){
this.name = name;
}
public void news(String info){
System.out.println("公众号【" + name + "】更新内容啦!");
this.setChanged();
this.notifyObservers(info);
}
}
监听者(观察者)
/**
* 用户 -- 监听者(观察者)
*/
public class UserObServer implements Observer {
// 用户名
private String name;
public UserObServer(String name){
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println("用户【"+name+"】获取通知:"+arg);
}
}
由此可看出:
- 被观察者:我们只需要继承Observable 类,然后写一个新的方法,比如news()发布新的资讯,this.setChanged(); 表示被观察者发生了改变,而 this.notifyObservers(info);则表示将改变的内容info,发给所有的订阅者。
- 观察者:需要实现Observer 接口,并且实现Observer 接口中的update(Observable o, Object arg);方法,这里就是上面的被观察者调用notifyObservers()方法后执行的方法,update()方法将获取被观察者的更新内容。
测试类
@Test
public void ObServableTest(){
// 两个公众号
OfficeObServable officeObServable1 = new OfficeObServable("java知音");
OfficeObServable officeObServable2 = new OfficeObServable("程序猿DD");
// 三个用户
UserObServer userObServer1 = new UserObServer("大雄");
UserObServer userObServer2 = new UserObServer("丁香");
UserObServer userObServer3 = new UserObServer("胖虎");
// 大雄、丁香、胖虎都订阅java知音
officeObServable1.addObserver(userObServer1);
officeObServable1.addObserver(userObServer2);
officeObServable1.addObserver(userObServer3);
// 丁香、胖虎订阅程序猿DD
officeObServable2.addObserver(userObServer2);
officeObServable2.addObserver(userObServer3);
// 公众号推文
officeObServable1.news("MyBatis内容聚合");
officeObServable2.news("Spring Batch入门教程");
}
执行结果
公众号【java知音】更新内容啦!
用户【胖虎】获取通知:MyBatis内容聚合
用户【丁香】获取通知:MyBatis内容聚合
用户【大雄】获取通知:MyBatis内容聚合
公众号【程序猿DD】更新内容啦!
用户【胖虎】获取通知:Spring Batch入门教程
用户【丁香】获取通知:Spring Batch入门教程