观察者模式

  观察者模式,又叫发布-订阅模式。

  观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有的观察者对象,使他们能够自动更新自己。

  

  我们来看具体的代码实现,首先是抽象的通知者以及他的实现类:

  

 1 package observer;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 public abstract class Subject {
 7     private List<Observer> observers = new ArrayList<Observer>();
 8     private String subject;
 9 
10     public void attachObserver(Observer observer) {
11         observers.add(observer);
12     }
13 
14     public void detachObserver(Observer observer) {
15         observers.remove(observer);
16     }
17 
18     public void notifyObserver() {
19         for (Observer observer : observers) {
20             observer.update();
21         }
22     }
23 
24     public String getSubject() {
25         return subject;
26     }
27 
28     public void setSubject(String subject) {
29         this.subject = subject;
30     }
31 }
32 
33 public class ConcreteSubject extends Subject{
34 
35 }

  然后是抽象的观察者以及它的实现:

  

 1 package observer;
 2 
 3 public abstract class Observer {
 4     public abstract void update();
 5 }
 6 
 7 public class ConcreteObserver extends Observer{
 8     
 9     private String name;
10     private String observerState;
11     private Subject subject;
12     
13     public ConcreteObserver(Subject subject,String name){
14         this.subject = subject;
15         this.name = name;
16     }
17     
18     @Override
19     public void update() {
20         observerState = subject.getSubject();
21         System.out.println("观察者 "+name+" 的新状态是:"+observerState);
22     }
23 
24     public String getName() {
25         return name;
26     }
27 
28     public void setName(String name) {
29         this.name = name;
30     }
31 
32     public String getObserverState() {
33         return observerState;
34     }
35 
36     public void setObserverState(String observerState) {
37         this.observerState = observerState;
38     }
39 
40     public Subject getSubject() {
41         return subject;
42     }
43 
44     public void setSubject(Subject subject) {
45         this.subject = subject;
46     }
47     
48 }

  客户端调用类如下:

  

 1 public class MainClass {
 2     public static void main(String[] args) {
 3         Subject subject = new ConcreteSubject();
 4         
 5         subject.attachObserver(new ConcreteObserver(subject, "A"));
 6         subject.attachObserver(new ConcreteObserver(subject, "B"));
 7         subject.attachObserver(new ConcreteObserver(subject, "C"));
 8         
 9         subject.setSubject("哈哈");
10         subject.notifyObserver();
11         
12     }
13 }

  将一个系统分割成一些列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性,我们不希望为了维持一致性而使各类精密耦合,这样会给维护、扩展和重用都带来不便。

  一个subject可以有任意数量依赖它的Observer,一旦Subject的状态发生了改变,其他的观察者都会得到通知,subject发出通知时并不知道谁是它的Observer。

  那么观察者模式在什么时候使用呢?当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象改变的时候,应该考虑使用观察者模式。

  一个抽象模型有两个方面,其中一方面依赖于另一方面,这时使用观察者模式可以将这两者封装在独立的对象中使他们各自独立的改变和复用。

  观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响到另一边的变化。

posted @ 2012-10-29 12:02  寒剑飘香  阅读(249)  评论(0编辑  收藏  举报