您的位置:首页 > 编程语言 > Java开发

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

2017-08-31 15:12 405 查看
观察者模式:概念自行百度;

使用步骤(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("天气预报:天气晴朗,艳阳高照!!");

}

}

推模式:目标主动把观察者需要的数据推送给它;

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

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: