《JAVA与模式》第18天―观察者模式 (四)

2014-11-24 08:27:02 · 作者: · 浏览: 7
”设置为true
63. */
64. protected synchronized void setChanged() {
65. changed = true;
66. }
67.
68. /**
69. * 将“已变化”重置为false
70. */
71. protected synchronized void clearChanged() {
72. changed = false;
73. }
74.
75. /**
76. * 检测本对象是否已变化
77. */
78. public synchronized boolean hasChanged() {
79. return changed;
80. }
81.
82. /**
83. * Returns the number of observers of this Observable object.
84. *
85. * @return the number of observers of this object.
86. */
87. public synchronized int countObservers() {
88. return obs.size();
89. }
90. }


  这个类代表一个被观察者对象,有时称之为主题对象。一个被观察者对象可以有数个观察者对象,每个观察者对象都是实现Observer接口的对象。在被观察者发生变化时,会调用Observable的notifyObservers()方法,此方法调用所有的具体观察者的update()方法,从而使所有的观察者都被通知更新自己。
怎样使用JAVA对观察者模式的支持
  这里给出一个非常简单的例子,说明怎样使用JAVA所提供的对观察者模式的支持。在这个例子中,被观察对象叫做Watched;而观察者对象叫做Watcher。Watched对象继承自java.util.Observable类;而Watcher对象实现了java.util.Observer接口。另外有一个Test类扮演客户端角色。
  源代码
  被观察者Watched类源代码
[java]
1. package com.bankht.Observer.java;
2.
3. import java.util.Observable;
4.
5. /**
6. * @author: 特种兵—AK47
7. * @创建时间:2012-6-28 下午10:23:14
8. *
9. * @类说明 :被观察者Watched类源代码
10. */
11. public class Watched extends Observable {
12.
13. private String data = "";
14.
15. public String getData() {
16. return data;
17. }
18.
19. public void setData(String data) {
20.
21. if (!this.data.equals(data)) {
22. this.data = data;
23. setChanged();
24. }
25. notifyObservers();
26. }
27.
28. }

 观察者类源代码
[java]
1. package com.bankht.Observer.java;
2.
3. import java.util.Observable;
4. import java.util.Observer;
5.
6.
7. /**
8. * @author: 特种兵—AK47
9. * @创建时间:2012-6-28 下午10:23:44
10. *
11. * @类说明 : 观察者类源代码
12. */
13. public class Watcher implements Observer {
14.
15. public Watcher(Observable o) {
16. o.addObserver(this);
17. }
18.
19. @Override
20. public void update(Observable o, Object arg) {
21.
22. System.out.println("状态发生改变:" + ((Watched) o).getData());
23. }
24.
25. }

 测试类源代码
[java]
1. package com.bankht.Observer.java;
2.
3.
4. /**
5. * @author: 特种兵—AK47
6. * @创建时间:2012-6-28 下午10:25:43
7. *
8. * @类说明 :测试类源代码
9. */
10. public class Test {
11.
12. public static void main(String[] args) {
13.
14. // 创建被观察者对象
15. Watched watched = new Watched();
16. // 创建观察者对象,并将被观察者对象登记
17. new Watcher(watched);
18. // 给被观察者状态赋值
19. watched.setData("start");
20. watched.setData("run");
21. watched.setData("stop");
22.
23. }
24.
25. }


  Test对象首先创建了Watched和Watcher对象。在创建Watcher对象时,将Watched对象作为参数传入;然后Test对象调用Watched对象的setData()方法,触发Watched对象的内部状态变化;Watched对象进而通知实现登记过的Watcher对象,也就是调用它的update()方法。

作者:m13666368773