观察者模式例子:
1、一个被观察者接口Observed,有添加add、删除del、通知notify观察者的方法
2、一个具体被观察的类ObservedImpl,实现1中的被观察者接口Observed,,有一个属性pro,这个属性发生改变时调用通知观察者的方法notify
3、观察者接口Observer,有一个更新信息的方法updateInfo,需要传入被观察类ObservedConcrete的属性pro。
4、被观察者实现类ObserverImpl,实现Observer,重写接口updateInfo方法,有个属性name。
package com.my.obseveDemo;
/*
* 被观察者接口*/
public interface Obsevered {
//添加观察者
void add(Observer observer);
//删除观察者
void del(Observer observer);
//通知观察者
void notifyObservers();
}
package com.my.obseveDemo;
import java.util.Vector;
/*
* 被观察者实现类*/
public class ObserveredImpl implements Obsevered {
//注入观察者集合
private Vector<Observer> observers = new Vector<Observer>();
private int pro;
public ObserveredImpl(int pro){
super();
this.pro = pro;
}
public int getPro() {
return pro;
}
public void setPro(int pro) {
this.pro = pro;
notifyObservers();
}
public Vector<Observer> getObservers() {
return observers;
}
public void setObservers(Vector<Observer> observers) {
this.observers = observers;
}
@Override
public void add(Observer observer) {
observers.add(observer);
}
@Override
public void del(Observer observer) {
observers.remove(observer);
}
/*
* 取出执行观察者,并执行其更新操作*/
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(pro);
}
}
}
package com.my.obseveDemo;
/*
观察者接口
*/
public interface Observer {
// 更新方法,参数为被观察对象的属性
void update(int pro);
}
package com.my.obseveDemo;
/*
* 观察者接口实现类*/
public class ObserverImpl implements Observer{
private String name;
public ObserverImpl(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
//重写update方法,监测被观察者属性变化
public void update(int pro) {
System.out.println("被观察者属性更新为" + pro);
}
}
package com.my.obseveDemo;
public class Test {
public static void main(String[] args) {
ObserveredImpl obsevered = new ObserveredImpl(1);//实例化被观察者
//实例化两个观察者并添加进被观察者的列表中
Observer zc = new ObserverImpl("张三");
Observer ls = new ObserverImpl("李四");
obsevered.add(zc);
obsevered.add(ls);
// 被观察者属性变化,触发notifyObservers()方法
obsevered.setPro(5555);
// 输出:
// 被观察者属性更新为5555
// 被观察者属性更新为5555
}
}