java设计模式:观察者模式(Observer)

本文阐述了观察者模式在SNS网站中的应用,通过创建粉丝(观察者)和发布新消息(被观察者),实现了即时信息传递。利用Java实现案例展示了如何在实际场景中运用观察者模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

观察者模式(Observer):定义了对象之间的一对多依赖,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新。

案例:
对于SNS网站(如:微博)都有关注者、粉丝这些元数,当Follower(即粉丝跟随的人)发布新消息的时候,所有的粉丝都能在第一时间看到。当然,真实的微博系统不是这样实现的,这里只是演示观察者模式。结构示意图如下所示:




代码如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package com.juziku.pattern.observer;
  
/**
  * 观察者,比如粉丝
  * @author steven
  *
  */
public interface Observer {
     void update(Subject subject);
}
  
  
/**
  * 目标对象,作为被观察者
  * @author steven
  *
  */
public interface Subject {
     /**
      * 添加观察者
      */
     void addObserver(Observer observer);
      
     /**
      * 删除观察者
      */
     void deleteObserver(Observer observer);
      
     /**
      * 一旦有新消息,通知所有的粉丝(即:所有观察者)
      */
     void notifyObserver();
}
  
  
/**
  * 作为被观察者
  * @author steven
  *
  */
public class Follower implements Subject {
     private List<Observer> observers = new ArrayList<Observer>();
     private String content;
      
  
     @Override
     public void addObserver(Observer observer) {
         observers.add(observer);
     }
  
     @Override
     public void deleteObserver(Observer observer) {
         observers.remove(observer);
     }
  
     @Override
     public void notifyObserver() {
         for (Observer observer: observers){
             observer.update( this );
         }
     }
  
     public String getContent() {
         return content;
     }
  
     public void setContent(String content) {
         this .content = content;
          
         //通知所有的粉丝(即:所有观察者)
         this .notifyObserver();
     }
}
  
/**
  * 粉丝,作为观察者
  * @author steven
  *
  */
public class Fans implements Observer {
     private String name;
      
     @Override
     public void update(Subject subject) {
         System.out.println(name + " 收到一条消息,消息内容为:" + ((Follower)subject).getContent());
     }
  
     public void setName(String name) {
         this .name = name;
     }
      
      
}
  
public class ObserverTest {
  
     public static void main(String[] args) {
         /**
          * 创建一个follower,作为被观察者,一旦follower有新消息,
          * 则通知所有的粉丝(即:所有观察者)
          */
         Follower follower = new Follower();
          
         /**
          * 创建粉丝A,也就是观察者
          */
         Fans fansA = new Fans();
         fansA.setName( "张三" );        
         follower.addObserver(fansA);
          
         /**
          * 创建粉丝B
          */
         Fans fansB = new Fans();
         fansB.setName( "李四" );
         follower.addObserver(fansB);
          
         /**
          * follower有新消息,通知所有粉丝(即:所有观察者)
          */
         follower.setContent( "今天天气很好啊。" );
     }
  
}

当然,java也为我们提供了观察者模式支持,在java.util包里面有一个类Observable,它实现了大部分我们需要的目标功能;还有一个接口Observer,其中定义了update方法,就是观察者接口。下面演示了使用java为我们提供的类、接口,实现上面功能,代码如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import java.util.Observable;
import java.util.Observer;
  
/**
  * 粉丝,作为观察者
  * @author steven
  *
  */
public class Fans implements Observer {
     private String name;
      
     @Override
     public void update(Observable o, Object arg) {
         System.out.println(name + " 收到一条消息,消息内容为:" + ((Follower)o).getContent());
          
     }
  
     public void setName(String name) {
         this .name = name;
     }
      
}
  
  
import java.util.Observable;
  
/**
  * 作为被观察者
  * @author steven
  *
  */
public class Follower extends Observable {
     private String content;
  
     public String getContent() {
         return content;
     }
  
     public void setContent(String content) {
         this .content = content;
          
         //注意,在用java中的Observer模式的时候,这句不能少
         this .setChanged();
          
         //通知所有的粉丝(即:所有观察者)
         this .notifyObservers();
     }
}
  
  
public class ObserverTest {
  
     public static void main(String[] args) {
         /**
          * 创建一个follower,作为被观察者,一旦follower有新消息,
          * 则通知所有的粉丝(即:所有观察者)
          */
         Follower follower = new Follower();
          
         /**
          * 创建粉丝A,也就是观察者
          */
         Fans fansA = new Fans();
         fansA.setName( "张三" );        
         follower.addObserver(fansA);
          
         /**
          * 创建粉丝B
          */
         Fans fansB = new Fans();
         fansB.setName( "李四" );
         follower.addObserver(fansB);
          
         /**
          * follower有新消息,通知所有粉丝(即:所有观察者)
          */
         follower.setContent( "今天天气很好啊。" );
  
     }
  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值