观察者模式(发布-订阅模式)一个简单的使用
简介例子被监听者(被观察者)监听者(观察者)测试类简介
观察者模式(有时又被称为模型(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;}@Overridepublic 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()方法将获取被观察者的更新内容。
测试类
@Testpublic 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);// 丁香、胖虎订阅程序猿DDofficeObServable2.addObserver(userObServer2);officeObServable2.addObserver(userObServer3);// 公众号推文officeObServable1.news("MyBatis内容聚合");officeObServable2.news("Spring Batch入门教程");}
执行结果
公众号【java知音】更新内容啦!用户【胖虎】获取通知:MyBatis内容聚合用户【丁香】获取通知:MyBatis内容聚合用户【大雄】获取通知:MyBatis内容聚合公众号【程序猿DD】更新内容啦!用户【胖虎】获取通知:Spring Batch入门教程用户【丁香】获取通知:Spring Batch入门教程