观察者模式

观察者模式:
    观察者模式定义了对象之间的一对多依赖,这样一来当一个对象改变时,它的所有依赖者都会收到通知并自动更新。
 

        ObserverImplement类中实现一个含有SubjectImplement类的构造器用于向主题类注册,当主题实例发生改变时主题实例会执行notifyObserver()函数通知其下面注册的观察者(调用观察者的update()方法,所以观察者都要实现自己的update方法用于接收通知作出相应的改变)。主题实例会将注册的观察者保存在链表之中,用于之后的访问。
示例:
  1. 1 package com.renhq.subject;
    2 import com.renhq.observer.Observer;
    3 publicinterfaceSubject{
    4 publicvoid registerObserver(Observer ob);
    5 publicvoid removeObserver(Observer ob);
    6 publicvoid notifyObserver(String s);
    7 }

     

  1. 1 package com.renhq.observer;
    2 publicinterfaceObserver{
    3 publicvoid update(String s);
    4 }

     

  1.  1 package com.renhq.subject;
     2 import java.util.Iterator;
     3 import java.util.LinkedList;
     4 import java.util.List;
     5 import com.renhq.observer.Observer;
     6 publicclassSubjectImplementimplementsSubject{
     7 privateList<Observer> list =newLinkedList<Observer>();
     8 @Override
     9 publicvoid registerObserver(Observer ob){
    10 // TODO Auto-generated method stub
    11 this.list.add(ob);
    12 }
    13 @Override
    14 publicvoid removeObserver(Observer ob){
    15 // TODO Auto-generated method stub
    16 this.list.remove(ob);
    17 }
    18 @Override
    19 publicvoid notifyObserver(String s){
    20 // TODO Auto-generated method stub
    21 Iterator it = list.iterator();
    22 Observer ob;
    23 while(it.hasNext()){
    24 ob =(Observer)it.next();
    25 ob.update(s);
    26 }
    27 }
    28 publicvoid modify(String s){
    29 notifyObserver(s);
    30 }
    31 }

     

  1.  1 package com.renhq.observer;
     2 import com.renhq.subject.Subject;
     3 publicclassObserverImplementimplementsObserver{
     4 privateSubject subject;
     5 privateString chiness;
     6 privateString en;
     7 publicObserverImplement(Subject s){
     8 // TODO Auto-generated constructor stub
     9 subject = s;
    10 s.registerObserver(this);
    11 }
    12 @Override
    13 publicvoid update(String s){
    14 // TODO Auto-generated method stub
    15 System.out.println(s.equals("cn")?chiness:en);
    16 }
    17 publicString getChiness(){
    18 return chiness;
    19 }
    20 publicvoid setChiness(String chiness){
    21 this.chiness = chiness;
    22 }
    23 publicString getEn(){
    24 return en;
    25 }
    26 publicvoid setEn(String en){
    27 this.en = en;
    28 }
    29 }

     

  1.  1 package com.renhq.subject;
     2 import com.renhq.observer.Observer;
     3 import com.renhq.observer.ObserverImplement;
     4 publicclassTest{
     5 publicstaticvoid main(String[] args){
     6 // TODO Auto-generated method stub
     7 SubjectImplement subject =newSubjectImplement();
     8 ObserverImplement observer1 =newObserverImplement(subject);
     9 ObserverImplement observer2 =newObserverImplement(subject);
    10 observer1.setChiness("你好!");
    11 observer1.setEn("Hello!");
    12 observer2.setChiness("我是张三。");
    13 observer2.setEn("I'm Zhangsan.");
    14 subject.modify("en");
    15 System.out.println("--------------请说人话-----------------");
    16 subject.modify("cn");
    17 }
    18 }

     

运行结果:两个观察者都对主题的改变做出了回应
 





posted @ 2015-07-22 13:30  renhq  阅读(200)  评论(0)    收藏  举报