ITPub博客

首页 > 应用开发 > Java > 观察者模式

观察者模式

Java 作者:壹頁書 时间:2017-03-20 15:44:15 0 删除 编辑
http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html



  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. abstract class Subject {  
  5.     /** 
  6.      * 用来保存注册的观察者对象 
  7.      */  
  8.     private List list = new ArrayList();  
  9.   
  10.     /** 
  11.      * 注册观察者对象 
  12.      *  
  13.      * @param observer 
  14.      *            观察者对象 
  15.      */  
  16.     public void attach(Observer observer) {  
  17.   
  18.         list.add(observer);  
  19.         System.out.println("Attached an observer");  
  20.     }  
  21.   
  22.     /** 
  23.      * 删除观察者对象 
  24.      *  
  25.      * @param observer 
  26.      *            观察者对象 
  27.      */  
  28.     public void detach(Observer observer) {  
  29.   
  30.         list.remove(observer);  
  31.     }  
  32.   
  33.     /** 
  34.      * 通知所有注册的观察者对象 
  35.      */  
  36.     public void nodifyObservers(String newState) {  
  37.   
  38.         for (Observer observer : list) {  
  39.             observer.update(newState);  
  40.         }  
  41.     }  
  42. }  
  43.   
  44. class ConcreteSubject extends Subject {  
  45.   
  46.     private String state;  
  47.   
  48.     public String getState() {  
  49.         return state;  
  50.     }  
  51.   
  52.     public void change(String newState) {  
  53.         state = newState;  
  54.         System.out.println("主题状态为:" + state);  
  55.         // 状态发生改变,通知各个观察者  
  56.         this.nodifyObservers(state);  
  57.     }  
  58. }  
  59.   
  60. interface Observer {  
  61.     /** 
  62.      * 更新接口 
  63.      *  
  64.      * @param state 
  65.      *            更新的状态 
  66.      */  
  67.     public void update(String state);  
  68. }  
  69.   
  70. class ConcreteObserver implements Observer {  
  71.     // 观察者的状态  
  72.     private String observerState;  
  73.   
  74.     @Override  
  75.     public void update(String state) {  
  76.         /** 
  77.          * 更新观察者的状态,使其与目标的状态保持一致 
  78.          */  
  79.         observerState = state;  
  80.         System.out.println("状态为:" + observerState);  
  81.     }  
  82.   
  83. }  
  84.   
  85. class Client {  
  86.   
  87.     public static void main(String[] args) {  
  88.         // 创建主题对象  
  89.         ConcreteSubject subject = new ConcreteSubject();  
  90.         // 创建观察者对象  
  91.         Observer observer = new ConcreteObserver();  
  92.         // 将观察者对象登记到主题对象上  
  93.         subject.attach(observer);  
  94.         // 改变主题对象的状态  
  95.         subject.change("new state");  
  96.     }  
  97.   
  98. } 

JDK 观察者支持

  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. import java.util.Observable;  
  4. import java.util.Observer;  
  5.   
  6. class ConcreteSubject extends Observable {  
  7.     private String state;  
  8.   
  9.     public void setState(String state) {  
  10.         this.state = state;  
  11.     }  
  12.   
  13.     @Override  
  14.     public synchronized void addObserver(Observer arg0) {  
  15.         // TODO Auto-generated method stub  
  16.         super.addObserver(arg0);  
  17.     }  
  18.   
  19.     @Override  
  20.     public synchronized int countObservers() {  
  21.         // TODO Auto-generated method stub  
  22.         return super.countObservers();  
  23.     }  
  24.   
  25.     @Override  
  26.     protected synchronized void setChanged() {  
  27.         // TODO Auto-generated method stub  
  28.         super.setChanged();  
  29.         System.out.println("主题状态为:" + state);  
  30.         super.notifyObservers(state);  
  31.     }  
  32. }  
  33.   
  34. class ConcreteObserver implements Observer {  
  35.     // 观察者的状态  
  36.     private String observerState;  
  37.   
  38.     @Override  
  39.     public void update(Observable arg0, Object arg1) {  
  40.         String observerState = (String) arg1;  
  41.         System.out.println("观察者状态为:" + observerState);  
  42.     }  
  43.   
  44. }  
  45.   
  46. class Client {  
  47.   
  48.     public static void main(String[] args) {  
  49.         // 创建主题对象  
  50.         ConcreteSubject subject = new ConcreteSubject();  
  51.         // 创建观察者对象  
  52.         Observer observer1 = new ConcreteObserver();  
  53.         // 将观察者对象登记到主题对象上  
  54.         subject.addObserver(observer1);  
  55.   
  56.         Observer observer2 = new ConcreteObserver();  
  57.         subject.addObserver(observer2);  
  58.         // 改变主题对象的状态  
  59.         subject.setState("new state");  
  60.         subject.setChanged();  
  61.   
  62.         System.out.println(subject.countObservers());  
  63.     }  
  64.   
  65. } 


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-2135681/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 命令模式
下一篇: 责任链模式
请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339892