observer 观察者

一、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. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值