设计模式之观察者模式
定义:
定义了对象之间的一对多依赖关系,当一个对象改变时,其他依赖者都会收到消息并自动更新。
类图:

引用例子 1、我们将被依赖对象称为对象,依赖者称为对象的观察者。可以用订报纸的例子:订阅者 + 报纸 = 观察者模式
2、要实现一些布告板,布告板的信息来自于气象站,有各种不同的布告板,有的显示湿度、有的显示温度、天气预报等。
观察者模式实现方案: Object气象站 oberver布告板 (由于布告板也有一些命名等通用属性所以也要进行接口抽象)
1 package com.observer; 2 3 public interface Subject {//主题对象接口,包括对观察者的增删改查 消息通知 要在子类实现 4 public boolean remove(Observer o); 5 public boolean add(Observer o); 6 public void setChanged(); 7 public void notifyObserver(); 8 }
1 package com.observer; 2 3 import java.util.ArrayList; 4 5 public class ConcreateSubject implements Subject { 6 //用来存储观察者对象的集合 7 private ArrayList<Observer> Observerlist; 8 //气象站的信息属性 9 private float temperature; 10 private float humidity; 11 private float pressure; 12 private boolean isChanged; 13 //气象站构造函数,初始化,ischanged可以实现不是连续更新,而是设置间隔时间等 14 public ConcreateSubject(){ 15 this.Observerlist = new ArrayList<>(); 16 this.isChanged = false; 17 } 18 @Override 19 public boolean remove(Observer o) {//删除观察者 20 // TODO Auto-generated method stub 21 if(!this.Observerlist.contains(o)) 22 return false; 23 return this.Observerlist.remove(o); 24 } 25 26 @Override 27 public boolean add(Observer o) {//添加观察者 28 // TODO Auto-generated method stub 29 if(this.Observerlist.contains(o)) 30 return false; 31 return this.Observerlist.add(o); 32 } 33 34 @Override 35 public void setChanged() {//设置间隔 36 // TODO Auto-generated method stub 37 if(isChanged) 38 isChanged = false; 39 else 40 isChanged = true; 41 42 } 43 44 @Override 45 public void notifyObserver() {//将消息以推的方式告诉所有观察者 46 // TODO Auto-generated method stub 47 for(int i=0;i<this.Observerlist.size();i++){ 48 Observer o = (Observer)this.Observerlist.get(i); 49 o.update(this.temperature,this.humidity,this.pressure); 50 } 51 } 52 //设置气象站信息 53 public void setMeasurments(float temperature,float humidity,float prssure){ 54 this.humidity = humidity; 55 this.pressure = prssure; 56 this.temperature = temperature; 57 } 58 59 }
1 package com.observer; 2 3 public interface Observer {//观察者接口,所有观察者都要实现一个update方法,以便主题对象 4 //以推的方式向自己发送消息 5 public void update(float temperature, float humidity, float pressure); 6 }
package com.observer; public class Observer1 implements Observer{ ConcreateSubject subject; public Observer1(ConcreateSubject subject){ this.subject = subject; subject.add(this); } @Override public void update(float temperature, float humidity, float pressure) { // TODO Auto-generated method stub System.out.println(temperature+" "+pressure); } }
package com.observer; public class Observer2 implements Observer { private ConcreateSubject subject; public Observer2(ConcreateSubject subject){ this.subject = subject; subject.add(this); } @Override public void update(float temperature, float humidity, float pressure) { // TODO Auto-generated method stub System.out.println(humidity); } }
package com.observer; public class ObserverTest { public static void main(String args[]){ ConcreateSubject subject = new ConcreateSubject(); Observer1 o1 = new Observer1(subject); Observer2 o2 = new Observer2(subject); subject.add(o2); subject.add(o1); subject.setMeasurments(11, 1, 111); subject.notifyObserver();; subject.remove(o2); subject.setMeasurments(0, 1, 2); subject.notifyObserver();; } }
浙公网安备 33010602011771号