简单介绍观察者模式

观察者模式 ( 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 }
View Code
 
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 }
View Code

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 }
View Code

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 }
View Code

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 [生活大爆炸大更新!!!]
View Code

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/songyoulian/p/10069942.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值