public class ConcreteObserver implements Observer{
@Override
public void update() {
// TODO : update Observer
}
}
被观察者实现对观察者的增、删、改过程
public class ConcreteSubject implements Subject {
List<Observer> observers;
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
以上,基本概念介绍完了。下面就要开始实现一个自己的观察者模式了
观察者模式的简单实现
这里就拿 "订阅杂志" 的例子来实现吧
其中:
主题/被观察者:杂志社
订阅者/观察者:订阅杂志的人
首先是先抽象出观察者
public interface Observer {
/*所有的观察者都必须实现update()方法,以实现观察者接口*/
public void update(String magazine);
}
其次就是主题
public interface Subject {
/*这两个方法都需要观察者作为变量,该观察者是用来注册或被删除的*/
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
/*当主题状态改变时,这个方法会被调用,以通知所有的观察者*/
public void notifyObservers();
}
Magazine magazine = new Magazine();
Subscriber wang = new Subscriber(magazine, "小王");
Subscriber li = new Subscriber(magazine, "小李");
Subscriber ming = new Subscriber(magazine, "小明");
magazine.setMagazine("震惊!今天的杂志既然. . .");
public class Subscriber implements Observer{
private String name;
public Subscriber(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println("亲爱的" + name + ": 你的杂志已到,今日杂志名为《" + arg +"》");
}
}
测试
Magazine magazine = new Magazine();
Subscriber wang = new Subscriber("小王");
Subscriber li = new Subscriber("小李");
Subscriber ming = new Subscriber("小明");
magazine.addObserver(wang);
magazine.addObserver(li);
magazine.addObserver(ming);
magazine.notify("震惊!今天的杂志既然. . .");