观察者模式
观察者模式中主要包括两个角色,一个是主题,另一个是观察者。
其中主题用于存放数据、修改数据、观察者注册、观察者移除、通知观察者。
观察者用于从主题中获取新的数据、并将数据进行处理(显示、计算等等)
与订阅报纸类似,报社是主题、,每天都有新的数据信息更新,并且将新的信息通知给观察者(向报社订阅的人)。同时,每个人都可以称为订阅者、或者取消订阅。
由以上描述可知,观察者模式是一对多的关系。
每个具体主题需要实现主题,每个观察者也需要实现观察者接口。具体代码如下:
public interface Subject{
registerObsevers(Obsever obsever);
removeObsever(Obsever obsever);
notifyObsever();
}
public interface Obsever{
update();
}
以上是主题与观察者接口。以《Head First 设计模式》中气象数据显示的例子为例。具体代码为:
public WebData implements Subject{
private List<Obsever> obs;
private int tem;//湿度
private int data;//其余数据
public WebData(){
this.obs = new List<>();
}
registerObsevers(Obsever obsever){
this,obs.add(obsever);
}
removeObsever(Obsever obsever){
obs.remove(obsever);
}
notifyObsever(){
for (Obsever o : obs){
o.update();}
}
//以下还有一些数据更新等等的代码,在此不细写
public void dataUpda(){
。。。。//data更新等等
notifyObsever();
};
}
//观察者代码
public OneObsever implements Obsever{
private WebData sub;
private data;
public OneObsever(WebData webData){
this.WebData = webData;
}
public update(){
this,data = sub.getData();//获得具体观察者类中需要的数据
display(data);//对获取的数据进行相应的处理
}
public display();//实现对具体数据进行处理,具体代码不实现
}