一、Observer模式的意图:
在对象的内部状态发生变化时,自动通知外部对象进行响应。
二、Observer模式的构成:
·被观察者:内部状态有可能被改变,而且又需要通知外部的对象
·观察者:需要对内部状态的改变做出响应的对象
三、Observer模式的Java实现:
Java的API中已经为我们提供了Observer模式的实现。具体由java.util.Observable类和java.util.Observer接口完成。
前者有两个重要的方法:
·setChanged:设置内部状态为已改变
·notifyObservers(Object obj):通知观察者所发生的改变,参数obj是一些改变的信息
后者有一个核心方法:
·update(Object obj):相应被观察者的改变,其中obj就是被观察者传递过来的信息,该方法会在notifyObservers被调用时自动调用。
下面是Observer模式的实现过程:
·创建一个被观察者,继承java.util.Observable
·创建一个观察者,实现java.util.Observer接口
·注册观察着,调用addObserver(Observer observer)
·在被观察者改变对象内部状态的地方,调用setChanged()方法,然后调用notifyObservers(Object)方法,通知被观察者
·在观察者的update(Object)方法中,对改变做出响应。
四、Observer模式的好处:
1.Observer模式的优点:
·被观察者只需要知道谁在观察它,无需知道具体的观察细节
·被观察者一旦发生变化,只需要通过广播的方式告知观察者,至于消息如何到达则不需知道。这样的话无疑消除了被观察者和观察者之间通信的硬编码
·当一个被观察者同时被多个观察着观察时,观察者可以只选择自己感兴趣的事件,而忽略其它的事件
·多个观察者组合起来可以形成一个观察链,如果一旦需要回滚多个操作,此时观察链可以发挥作用
·观察者可以实时对被观察对象的变化做出响应,例如自动告警、中断运行等
2.运用Observer模式可以
·屏蔽线程间的通信机制:例如两个线程之间,主线程可以作为观察者,执行线程是被观察者。彼此之间只知道对方存在,但不知道之间通信的细节
·消除硬编码:如果没有Observer模式,则只能采用回调的模式,或者在代码中显示地调用观察者
·优化异常机制:特别适合在异常发生时向顶层监控,减少try-catch代码量
Observer模式的功用,是希望两个(或多个)对象,我们称之为Subject和Observer,当一方的状态发生改变的时候,另一方能够得到通知。也就是说,作为Observer的一方,能够监视到Subject的某个特定的状态变化,并为之做出反应。
我对观察者理解就是一个中心点把所有变化的信息都收集上来,这个中心点有一个名单,根据名单把所有变化的信息散发出去。下面是对学生和老师发送的会议通知:
Java代码
1. public interface Subject //
2. {
3. public void register(Object object);
4. public void remove(Object object);
5. public void nofiyObserver();
6. public void setMeeting(String meeting);
7. }
8.
9. public class SubjectCenter implements Subject
10. {
11. private List<Object> list = new ArrayList<Object>();
12. private String meeting;
13.
14. public void register(Object object);
15. {
16. list.add(object);//survey name list
17. }
18.
19. public void remove(Object object);
20. {
21. if(list.indexOf(object) > 0) //remove name list
22. list.remove(i);
23. }
24.
25. public void nofiyObserver();
26. {
27. for(int i = 0;i < list.size();i++)
28. {
29. Observer observer =(Observer)list.get(i);
30. //nofiy student and teacher join to meeting
31. observer.update(meeting);
32. }
33. }
34.
35. public void setMeeting(Sting meet)
36. {
37. this.meeting = meeting;//the school have a meeting;
38. nofiyObserver(); // send meeting message
39. }
40. }
41.
42. public interface Observer
43. {
44. public void update(String info);
45. }
46.
47. public class Student implements Observer
48. {
49. public void update(String info)
50. {
51. System.out.println("Hi Guys ,Today have a meeting about" +info);
52. }
53. }
54.
55. public class Teacher implements Observer
56. {
57. public void update(String info)
58. {
59. System.out.println("Hi Sir,Today have a meeting about"+info);
60. }
61.
62. }
63.
64. public class TestObserver
65. {
66. public static void main(String[]args)
67. {
68. Subject subject = new SubjectCenter();
69. Oberver student = new Student();
70. Oberver teacher = new Teacher();
71. subject.register(student);//add student observer
72. subject.register(teacher); //add teacher observer
73. subject.setMeeting("Wrap-up meeting");
74. }
75. }
在对象的内部状态发生变化时,自动通知外部对象进行响应。
二、Observer模式的构成:
·被观察者:内部状态有可能被改变,而且又需要通知外部的对象
·观察者:需要对内部状态的改变做出响应的对象
三、Observer模式的Java实现:
Java的API中已经为我们提供了Observer模式的实现。具体由java.util.Observable类和java.util.Observer接口完成。
前者有两个重要的方法:
·setChanged:设置内部状态为已改变
·notifyObservers(Object obj):通知观察者所发生的改变,参数obj是一些改变的信息
后者有一个核心方法:
·update(Object obj):相应被观察者的改变,其中obj就是被观察者传递过来的信息,该方法会在notifyObservers被调用时自动调用。
下面是Observer模式的实现过程:
·创建一个被观察者,继承java.util.Observable
·创建一个观察者,实现java.util.Observer接口
·注册观察着,调用addObserver(Observer observer)
·在被观察者改变对象内部状态的地方,调用setChanged()方法,然后调用notifyObservers(Object)方法,通知被观察者
·在观察者的update(Object)方法中,对改变做出响应。
四、Observer模式的好处:
1.Observer模式的优点:
·被观察者只需要知道谁在观察它,无需知道具体的观察细节
·被观察者一旦发生变化,只需要通过广播的方式告知观察者,至于消息如何到达则不需知道。这样的话无疑消除了被观察者和观察者之间通信的硬编码
·当一个被观察者同时被多个观察着观察时,观察者可以只选择自己感兴趣的事件,而忽略其它的事件
·多个观察者组合起来可以形成一个观察链,如果一旦需要回滚多个操作,此时观察链可以发挥作用
·观察者可以实时对被观察对象的变化做出响应,例如自动告警、中断运行等
2.运用Observer模式可以
·屏蔽线程间的通信机制:例如两个线程之间,主线程可以作为观察者,执行线程是被观察者。彼此之间只知道对方存在,但不知道之间通信的细节
·消除硬编码:如果没有Observer模式,则只能采用回调的模式,或者在代码中显示地调用观察者
·优化异常机制:特别适合在异常发生时向顶层监控,减少try-catch代码量
Observer模式的功用,是希望两个(或多个)对象,我们称之为Subject和Observer,当一方的状态发生改变的时候,另一方能够得到通知。也就是说,作为Observer的一方,能够监视到Subject的某个特定的状态变化,并为之做出反应。
我对观察者理解就是一个中心点把所有变化的信息都收集上来,这个中心点有一个名单,根据名单把所有变化的信息散发出去。下面是对学生和老师发送的会议通知:
Java代码
1. public interface Subject //
2. {
3. public void register(Object object);
4. public void remove(Object object);
5. public void nofiyObserver();
6. public void setMeeting(String meeting);
7. }
8.
9. public class SubjectCenter implements Subject
10. {
11. private List<Object> list = new ArrayList<Object>();
12. private String meeting;
13.
14. public void register(Object object);
15. {
16. list.add(object);//survey name list
17. }
18.
19. public void remove(Object object);
20. {
21. if(list.indexOf(object) > 0) //remove name list
22. list.remove(i);
23. }
24.
25. public void nofiyObserver();
26. {
27. for(int i = 0;i < list.size();i++)
28. {
29. Observer observer =(Observer)list.get(i);
30. //nofiy student and teacher join to meeting
31. observer.update(meeting);
32. }
33. }
34.
35. public void setMeeting(Sting meet)
36. {
37. this.meeting = meeting;//the school have a meeting;
38. nofiyObserver(); // send meeting message
39. }
40. }
41.
42. public interface Observer
43. {
44. public void update(String info);
45. }
46.
47. public class Student implements Observer
48. {
49. public void update(String info)
50. {
51. System.out.println("Hi Guys ,Today have a meeting about" +info);
52. }
53. }
54.
55. public class Teacher implements Observer
56. {
57. public void update(String info)
58. {
59. System.out.println("Hi Sir,Today have a meeting about"+info);
60. }
61.
62. }
63.
64. public class TestObserver
65. {
66. public static void main(String[]args)
67. {
68. Subject subject = new SubjectCenter();
69. Oberver student = new Student();
70. Oberver teacher = new Teacher();
71. subject.register(student);//add student observer
72. subject.register(teacher); //add teacher observer
73. subject.setMeeting("Wrap-up meeting");
74. }
75. }