/**
* 观察者类的具体实现
*/
public class ConcreteObserver implements Observer{
//名称的变量
private String observerName;

public String getObserverName() {
return observerName;
}

public void setObserverName(String observerName) {
this.observerName = observerName;
}

//o是拉的方式,arg是推的方式传递的信息
@Override
public void update(Observable o, Object arg) {
//第一种是推的方式
System.out.println(observerName+"收到了消息,目标推送过来的是"+arg);
//第二种是拉的方式
System.out.println(observerName+"收到了消息,主动到目标对象中去拉,拉的内容是"+
((ConcreteWeatherSubject)o).getContent());
}
}
/**
* 天气目标的具体实现类
*/
public class ConcreteWeatherSubject extends Observable{
//天气情况的内容
private String content;

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
//天气情况有了,就要通知所有的观察者
//注意在通知之前,在用java中的Observer模式时候,下面这句话不可少
this.setChanged();
//然后主动通知,这里我们先用推的方式
this.notifyObservers(content);
//如果是拉的方式,我们就调用
//this.notifyObservers();
}
}
public class Client {
public static void main(String[] args){
//创建天气作为一个目标,也可以说是被观察者
ConcreteWeatherSubject subject=new ConcreteWeatherSubject();
//创建一个女朋友作为观察者
ConcreteObserver girl=new ConcreteObserver();
girl.setObserverName("女朋友");
//创建老妈作为观察者
ConcreteObserver mum=new ConcreteObserver();
mum.setObserverName("老妈");
//注册观察者
subject.addObserver(girl);
subject.addObserver(mum);
//目标更新天气情况
subject.setContent("天气晴,气温28度");
}
}