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

ObserverImplement类中实现一个含有SubjectImplement类的构造器用于向主题类注册,当主题实例发生改变时主题实例会执行notifyObserver()函数通知其下面注册的观察者(调用观察者的update()方法,所以观察者都要实现自己的update方法用于接收通知作出相应的改变)。主题实例会将注册的观察者保存在链表之中,用于之后的访问。
示例:
-
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 package com.renhq.observer; 2 publicinterfaceObserver{ 3 publicvoid update(String s); 4 }
-
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 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 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 }
运行结果:两个观察者都对主题的改变做出了回应


浙公网安备 33010602011771号