观察者模式(Observer Pattern)

    观察者模式是对象的行为模式,又叫做发布-订阅模式、模型-视图模式、源-监听器模式或从属者模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
类图:

观察者模式(Observer Pattern)


示例一:
1、结构
观察者模式(Observer Pattern)
 
观察者模式(Observer Pattern)
观察者模式(Observer Pattern)


2、java代码
Subject接口:
package observer.subject;
import observer.observer.Observer;
public interface Subject {
 public void attach(Observer o);
 public void detach(Observer o);
 public void notifyObservers();
}
 
 
ConcreteSubject类:
package observer.subject;
import java.util.Enumeration;
import java.util.Vector;
import observer.observer.Observer;
public class ConcreteSubject implements Subject{
 private Vector observersVector = new Vector();
 public void attach(Observer o) {
  observersVector.addElement(o);
 }
 public void detach(Observer o) {
  observersVector.removeElement(o);
 }
 public void notifyObservers() {
  Enumeration enmu = observes();
  while(enmu.hasMoreElements()){
   ((Observer)enmu.nextElement()).update();
  }
 }
 public Enumeration observes(){
  return ((Vector) observersVector.clone()).elements(); 
 }
}
 
 
Observer接口:
package observer.observer;
public interface Observer {
 public void update();
}

 
ConcreteObserver类:
package observer.observer;

public class ConcreteObserver implements Observer{
 public void update() {
  System.out.println("I am noticed......");
 }
}
 
 
Client类:
package observer;
import observer.observer.ConcreteObserver;
import observer.observer.Observer;
import observer.subject.ConcreteSubject;
import observer.subject.Subject;
public class Client {
 public static void main(String args[]){
  Subject subject = new ConcreteSubject();
  Observer o = new ConcreteObserver();
  subject.attach(o);
  subject.notifyObservers();
     subject.detach(o);
     subject.notifyObservers();
 }
}
 
 
示例二:
1、结构
观察者模式(Observer Pattern)
 

2、java代码
Subject接口:
package observer1.subject;
import java.util.Enumeration;
import java.util.Vector;
import observer1.observer.Observer;
abstract public class Subject {
 private Vector observersVector = new Vector();
 public void attach(Observer o) {
  observersVector.addElement(o);
 }
 public void detach(Observer o) {
  observersVector.removeElement(o);
 }
 public void notifyObservers() {
  Enumeration enmu = observes();
  while(enmu.hasMoreElements()){
   ((Observer)enmu.nextElement()).update();
  }
 }
 public Enumeration observes(){
  return ((Vector) observersVector.clone()).elements(); 
 }
 
}
 
 
ConcreteSubject类:
package observer1.subject;
public class ConcreteSubject extends Subject{
 private String state;
 public void  change(String state){
  this.state = state;
  System.out.println("State is " + this.state);
  this.notifyObservers();
 }
}
 
 
Observer接口:
package observer1.observer;
public interface Observer {
 public void update();
}

 
ConcreteObserver类:
package observer1.observer;

public class ConcreteObserver implements Observer{
 public void update() {
  System.out.println("I am noticed......");
 }
}
 
 
Client类:
package observer1;
import observer1.observer.ConcreteObserver;
import observer1.observer.Observer;
import observer1.subject.ConcreteSubject;
public class Client {
 private static ConcreteSubject subject;
 private static Observer observer;
 public static void main(String args[]) {
  subject = new ConcreteSubject();
  observer = new ConcreteObserver();
  subject.attach(observer);
  subject.change("new state");
 }
}