当前位置:编程学习 > JAVA >>

《JAVA与模式》第18天—观察者模式

 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
  观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
________________________________________
 
观察者模式的结构
  一个软件系统里面包含了各种对象,就像一片欣欣向荣的森林充满了各种生物一样。在一片森林中,各种生物彼此依赖和约束,形成一个个生物链。一种生物的状态变化会造成其他一些生物的相应行动,每一个生物都处于别的生物的互动之中。
  同样,一个软件系统常常要求在某一个对象的状态发生变化的时候,某些其他的对象做出相应的改变。做到这一点的设计方案有很多,但是为了使系统能够易于复用,应该选择低耦合度的设计方案。减少对象之间的耦合有利于系统的复用,但是同时设计师需要使这些低耦合度的对象之间能够维持行动的协调一致,保证高度的协作。观察者模式是满足这一要求的各种设计方案中最重要的一种。
  下面以一个简单的示意性实现为例,讨论观察者模式的结构。
 

 观察者模式所涉及的角色有:
  ●  抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。
  ●  具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。
  ●  抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。
  ●  具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。
  源代码
    抽象主题角色类
[java] 
1. package com.bankht.Observer; 
2.  
3. import java.util.ArrayList; 
4. import java.util.List; 
5.  
6. /**
7.  * @author: 特种兵—AK47
8.  * @创建时间:2012-6-28 下午09:43:26
9.  * 
10.  * @类说明 :抽象主题角色类
11.  */ 
12. public abstract class Subject { 
13.     /**
14.      * 用来保存注册的观察者对象
15.      */ 
16.     private List<Observer> list = new ArrayList<Observer>(); 
17.  
18.     /**
19.      * 注册观察者对象
20.      * 
21.      * @param observer
22.      *            观察者对象
23.      */ 
24.     public void attach(Observer observer) { 
25.  
26.         list.add(observer); 
27.         System.out.println("Attached an observer"); 
28.     } 
29.  
30.     /**
31.      * 删除观察者对象
32.      * 
33.      * @param observer
34.      *            观察者对象
35.      */ 
36.     public void detach(Observer observer) { 
37.  
38.         list.remove(observer); 
39.     } 
40.  
41.     /**
42.      * 通知所有注册的观察者对象
43.      */ 
44.     public void nodifyObservers(String newState) { 
45.  
46.         for (Observer observer : list) { 
47.             observer.update(newState); 
48.         } 
49.     } 
50. } 
 

 
  具体主题角色类
[java] 
1. package com.bankht.Observer; 
2.  
3. /**
4.  * @author: 特种兵—AK47
5.  * @创建时间:2012-6-28 下午09:44:36
6.  * 
7.  * @类说明 :具体主题角色类
8.  */ 
9. public class ConcreteSubject extends Subject { 
10.  
11.     private String state; 
12.  
13.     public String getState() { 
14.         return state; 
15.     } 
16.  
17.     public void change(String newState) { 
18.         state = newState; 
19.         System.out.println("主题状态为:" + state); 
20.         // 状态发生改变,通知各个观察者  
21.         this.nodifyObservers(state); 
22.     } 
23. } 
 

 
  抽象观察者角色类
[java] 
1. package com.bankht.Observer; 
2.  
3. /**
4.  * @author: 特种兵—AK47
5.  * @创建时间:2012-6-28 下午09:45:20
6.  * 
7.  * @类说明 : 抽象观察者角色类
8.  */ 
9. public interface Observer { 
10.     /**
11.      * 更新接口
12.      * 
13.      * @param state
14.      *            更新的状态
15.      */ 
16.     public void update(String state); 
17. } 
 

 
  具体观察者角色类
[java] 
1. package com.bankht.Observer; 
2.  
3. /**
4.  * @author: 特种兵—AK47
5.  * @创建时间:2012-6-28 下午09:45:58
6.  * 
7.  * @类说明 :具体观察者角色类
8.  */ 
9. public class ConcreteObserver implements Observer { 
10.     // 观察者的状态  
11.     private String observerState; 
12.  
13.     @Override 
14.     public void update(String state) { 
15.         /**
16.          * 更新观察者的状态,使其与目标的状态保持一致
17.          */ 
18.         observerState = state; 
19.         System.out.println("状态为:" + observerState); 
20.    

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,