对象间存在一对多关系时,让多个观察者对象同时监听某一个主题对象。当主题对象被修改时,会自动通知依赖它的观察者对象,使它们能自动更新。
示例:购买彩票
类图
1、主题接口
public interface Subject {
/** 注册观察者 */
void addObserver(Observer observer);
/** 移除观察者 */
void deleteObserver(Observer observer);
/** 通知观察者 */
void notifyObservers();
}
2、观察者接口
public interface Observer {
/**
* 观察者获得主题消息
* @param msg
*/
void update(String msg);
}
3、彩票站(主题)
public class Lottery implements Subject {
/** 主题存储观察者集合 */
private List<Observer> observerList;
/** 主题消息 */
private String msg;
public Lottery(String msg){
this.observerList = new ArrayList<Observer>();
this.msg = msg;
}
/**
* 存放观察者
* @param observer
*/
public void addObserver(Observer observer) {
this.observerList.add(observer);
}
/**
* 删除观察者
* @param observer
*/
public void deleteObserver(Observer observer) {
int index = this.observerList.indexOf(observer);
if(-1 != index){
this.observerList.remove(index);
}
}
/**
* 通知观察者们
*/
public void notifyObservers() {
for (Observer observer : observerList) {
observer.update(msg);
}
}
}
4、买家(观察者)
public class Buyer implements Observer {
/** 观察者姓名*/
private String name;
/** 主题 */
private Subject subject;
public Buyer(String name, Subject subject) {
this.name = name;
this.subject = subject;
this.subject.addObserver(this);
}
public void update(String msg) {
System.out.println("观察者" + name + "订阅消息:" + msg);
}
}
5、测试
public class Main {
public static void main(String[] args) {
Subject subject = new Lottery("中奖号码: 888888");
Observer observer1 = new Buyer("张三", subject);
Observer observer2 = new Buyer("李四", subject);
Observer observer3 = new Buyer("王五", subject);
subject.addObserver(observer1);
subject.notifyObservers();
}
}