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

观察者模式(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( "今天天气很好啊。" );
  
     }
  
}

你可能感兴趣的:(java,设计模式,String,Class,import,interface)