java设计模式--观察者模式

观察者模式:概念自行百度;

使用步骤(java提供接口):
被观察者(目标:一方):继承Observable类,在目标提醒变量的set方法中调用notifyObservers方法:此方法可以调

用两个中任意一个,并且与观察者update方法参数对应,①notifyObservers(object arg)推模式直接把需要的内容

推送过去②notifyObservers()拉模式,默认把自己整个对象推送过去,观察者根据需要自己通过对象(目标对象)

获取.
注意:在调用notifyObservers方法之前,必须先调用this.setChanged()方法,此方法通知观察者目标(目标本身)发

生了变化,还有notifyObservers方法对应观察者类的update(Observable o, Object arg)方法;

被观察者(目标)代码:
public class ConcreteWeatherSubject extends Observable{
private String weathercontent;

public String getWeathercontent() {
return weathercontent;
}

public void setWeathercontent(String weathercontent) {
this.weathercontent = weathercontent;
this.setChanged();//此方法必须调用
// this.notifyObservers();
this.notifyObservers(weathercontent);
}

}

观察者(多方):实现Observer接口,重写update(Observable o, Object arg)方法(第一个参数为目标调用用

notifyObservers(object arg)时对应的目标本身对象为拉模式,第二个参数为目标调用notifyObservers()时目标

主动推送的内容为推模式)

观察者代码:
public class ConcreteObserver implements Observer{
private String observername;
public String getObservername() {
return observername;
}

public void setObservername(String observername) {
this.observername = observername;
}

@Override
public void update(Observable o, Object arg) {
System.out.println(observername+"收到了:"+arg);
// System.out.println(observername+"收到了:"+((ConcreteWeatherSubject)

o).getWeathercontent());

}

}

测试类:注意观察者需要注册,需要被观察者调用addObserver()方法
public class Test {
public static void main(String[] args) {
ConcreteWeatherSubject subject = new ConcreteWeatherSubject();
ConcreteObserver observer1 = new ConcreteObserver();
observer1.setObservername("张三");
ConcreteObserver observer2 = new ConcreteObserver();
observer2.setObservername("李四");
subject.addObserver(observer1);//注册观察者对象
subject.addObserver(observer2);//注册观察者对象
subject.setWeathercontent("天气预报:天气晴朗,艳阳高照!!");
}
}

推模式:目标主动把观察者需要的数据推送给它;
拉模式:目标把自己本身对象推送给观察者,由观察者自己取所需数据

第一次写文章,纯属个人理解,还请多多指教!!



你可能感兴趣的:(java设计模式)