观察者模式又称发布-订阅模式,就是观察者通过订阅被观察者,或关注被观察者,从而实时更新观察者的信息。比如我们玩微博的时候,如果关注了一些博主,那么当博主发动态时,在首页微博列表中就会自动更新这些博主发的微博,而不需要我们自己去获取。其中我们(粉丝)就是观察者,博主是被观察者,关注就相当于订阅,订阅之后被观察者的更新动态都会通知给观察者,从而更细观察者自己的关注信息。
下面以微博为例,假设有三个程序员分别是张三、李四、王麻子,还有一个名为Java大本营的一个博主,这个博主每天会更新一些java知识的博文,在关注之前这三个程序员必须每次主动进入这个博主的主页去查看有哪些更新,为了不这么麻烦,他们决定关注这个博主,订阅他更新的文章,这样他们只要在自己的微博关注中下拉刷新一下,就能看到博主所有的动态。
第一步:创建一个观察者接口
1 /* 2 * 定义一个观察者接口 3 */ 4 public interface Observer { 5 //更新消息 6 public void update(String message,String bloggerName); 7 }
第二步:定义一个微博用户类,做为观察者实现上面的接口
1 /* 2 * 定义一个微博用户类,实现观察者接口 3 */ 4 public class WeiboUser implements Observer { 5 private String nickName;// 用户昵称 6 7 public WeiboUser(String nickName) { 8 this.nickName = nickName; 9 } 10 11 /* 12 * 微博用户刷新自己的关注列表 13 */ 14 public void update(String message, String bloggerName) { 15 System.out.println("用户" + nickName + "收到了博主" + bloggerName + "更新的微博:" + message); 16 } 17 }
第三步:定义一个被观察者接口,用来添加、删除、通知观察者
1 /* 2 * 定义一个被观察者接口:接口中定义增加观察者、删除观察者和通知观察者的接口 3 */ 4 public interface Observable { 5 // 增加观察者 6 public void addObserver(Observer observe); 7 8 // 删除观察者 9 public void deleteObserver(Observer observer); 10 11 // 通知观察者 12 public void notifyObserver(); 13 14 }
第四步:定义一个博主类,作为被观察者实现上面的接口
1 /* 2 * 定义一个博主类:实现被观察者接口 3 */ 4 public class Blogger implements Observable { 5 public String name;// 博主名称 6 public String message;// 微博信息 7 public List<Observer> fansList = new ArrayList<Observer>();// 粉丝列表 8 9 public Blogger(String name) { 10 this.name = name; 11 } 12 13 // 增加一个粉丝 14 public void addObserver(Observer observer) { 15 fansList.add(observer); 16 } 17 18 // 删除一个粉丝 19 public void deleteObserver(Observer observer) { 20 if (!fansList.isEmpty()) { 21 fansList.remove(observer); 22 } 23 } 24 25 // 通知粉丝更新的消息 26 public void notifyObserver() { 27 for (Observer observer : fansList) { 28 observer.update(message, name); 29 } 30 } 31 32 // 博主更新微博 33 public void updateWeibo(String message) { 34 this.message = message; 35 System.out.println("博主" + name + "更新了一条微博,内容为:" + message); 36 } 37 38 }
第五步:用户开始玩微博
1 /* 2 * 实现玩微博 3 */ 4 public class PlayWeibo { 5 public static void main(String[] args) { 6 // 三个程序员用户 7 Observer zhangsan = new WeiboUser("张三"); 8 Observer lisi = new WeiboUser("李四"); 9 Observer wangmazi = new WeiboUser("王麻子"); 10 // Java大本营博主 11 Blogger javaBlogger = new Blogger("Java大本营"); 12 13 //让三个程序员关注博主 14 javaBlogger.addObserver(zhangsan); 15 javaBlogger.addObserver(lisi); 16 javaBlogger.addObserver(wangmazi); 17 18 //Java大本营更新微博 19 javaBlogger.updateWeibo("Java是世界上最好的语言"); 20 21 //Java大本营通知所有粉丝 22 javaBlogger.notifyObserver(); 23 24 //粉丝张三对Java大本营取关 25 javaBlogger.deleteObserver(zhangsan); 26 27 //Java大本营又更新了一条消息 28 javaBlogger.updateWeibo("Hello World!"); 29 30 //Java大本营再次通知所有粉丝 31 javaBlogger.notifyObserver(); 32 33 } 34 }
第六步:分析结果
1 博主Java大本营更新了一条微博,内容为:Java是世界上最好的语言 2 用户张三收到了博主Java大本营更新的微博:Java是世界上最好的语言 3 用户李四收到了博主Java大本营更新的微博:Java是世界上最好的语言 4 用户王麻子收到了博主Java大本营更新的微博:Java是世界上最好的语言 5 博主Java大本营更新了一条微博,内容为:Hello World! 6 用户李四收到了博主Java大本营更新的微博:Hello World! 7 用户王麻子收到了博主Java大本营更新的微博:Hello World!
从上述结果可以看出,当三个程序员用户关注了博主之后,每当博主发布了微博,他们三个都能收到;而当张三取关博主之后,博主再次更新的微博他就看不到了,所以说只有用户(观察者)关注(订阅)了博主(被观察者),才能及时看到博主更新的内容,这就是观察者模式,或发布-订阅模式。