观察者模式:概念自行百度;
使用步骤(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设计模式--观察者模式
最新推荐文章于 2024-08-01 15:05:06 发布