观察者模式 (
Observer Pattern) 是一种
"发布者-订阅者"的模式.有时候也被称为
"模型视图模式",
"源-监听者模式"等. 在这种模式中,由一个目标对象来管理所有依赖与它的观察者对象,并且当这个目标对象自身发生改变时,会主动向它的观察者们发出通知.
实例场景 : 在某视频网站购买了<生活大爆炸>的独家版权,用户想要看<生活大爆炸>,则必须注册会员,监听是否有新作品更新,如果注册成功,当它有新作品更新时,便会发消息通知你,你就可以看最新的更新视频.
UML图
步骤 :
1 创建Subject顶级接口,里面定义了监听者注册,移除,通知的规则;
1 /** 2 * @Author : zhuhuicong 3 * 2018/12/5 10:29 4 * @Version 1.0 5 */ 6 //Subject顶级接口 7 public interface Subject { 8 void registerObserver(Observer o); 9 void removeObserver(Observer o); 10 void notifyAllObserver(); 11 }
2 创建观察者接口,定义一个更新通知的方法.
1 /** 2 * @Author : zhuhuicong 3 * 2018/12/5 10:29 4 * @Version 1.0 5 */ 6 7 //观察者的接口 8 public interface Observer { 9 void update(Subject s); 10 }
3 模拟某视频网站,去实现Subject接口.
1 /** 2 * @Author : zhuhuicong 3 * 2018/12/5 10:33 4 * @Version 1.0 5 */ 6 7 //某视频网站,实现了Subject接口 8 public class VideoSite implements Subject { 9 //观察者列表 10 private ArrayList<Observer> userList; 11 //更新了的视频列表 12 private ArrayList<String> videos; 13 14 public VideoSite() { 15 userList = new ArrayList<Observer>(); 16 videos = new ArrayList<String>(); 17 } 18 19 @Override 20 public void registerObserver(Observer o) { 21 userList.add(o); 22 } 23 24 @Override 25 public void removeObserver(Observer o) { 26 userList.remove(o); 27 } 28 29 @Override 30 public void notifyAllObserver() { 31 for (Observer user : userList) { 32 user.update(this); 33 } 34 } 35 36 public void addVideos(String video){ 37 this.videos.add(video); 38 notifyAllObserver(); //通着所有的用户 39 } 40 41 public ArrayList<String> getVideos(){ 42 return videos; 43 } 44 45 public String toString(){ 46 return videos.toString(); 47 } 48 }
4 实现观察者(对应应用场景就是爱好看美剧的人)
1 /** 2 * @Author : zhuhuicong 3 * 2018/12/5 10:41 4 * @Version 1.0 5 */ 6 7 //实现观察者,即看视频的美剧迷们 8 public class ViderFans implements Observer{ 9 10 private String name ; 11 12 public ViderFans(String name) { 13 this.name = name; 14 } 15 16 @Override 17 public void update(Subject s) { 18 System.out.println(this.name + ",new Video are available! "); 19 System.out.println(s); 20 } 21 }
5 测试类:
1 /*** @Author : zhuhuicong* 2018/12/5 10:44* @Version 1.0*/public class TestObserver {public static void main(String[] args) {//1新建一个视频网站对象VideoSite vs = new VideoSite();//2创建美剧迷然后注册到观察者的序列中vs.registerObserver(new ViderFans("张三"));vs.registerObserver(new ViderFans("李四"));vs.registerObserver(new ViderFans("王五"));//电视网站新作品推出,便会通知每一个观察者vs.addVideos("生活大爆炸大更新!!!");}} 2 3 Result: 4 张三,new Video are available! 5 [生活大爆炸大更新!!!] 6 李四,new Video are available! 7 [生活大爆炸大更新!!!] 8 王五,new Video are available! 9 [生活大爆炸大更新!!!]