观察者模式的构成:
1.抽象主题角色:把所有观察者对象保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者,抽象主题提供一个接口,可以增加、删除观察者。一般用一个抽象类或接口来实现。
2.抽象观察者角色:为所有的具体观察者提供一个接口,当主题角色发生改变的时候实时更新自己的状态。
3.具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
4.具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
实例程序
抽象观察者:
package obs.observer;
public interface Observer {
public void update(String str);
}
抽象主题(被观察者):
package obs.observer;
public interface Observered {
public void addObserver(Observer obs);
public void deleteObserver(Observer obs);
public void notifiyAll(String str);
}
具体观察者:
package obs.observer;
public class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void update(String str) {
System.out.println("被观察者发生变化:"+str+this.name);
}
}
具体主题:
package obs.observer;
import java.util.ArrayList;
import java.util.List;
public class ConcreteObservered implements Observered {
private List<Observer> list = new ArrayList<Observer>();
@Override
public void addObserver(Observer obs) {
list.add(obs);
}
@Override
public void deleteObserver(Observer obs) {
list.remove(obs);
}
@Override
public void notifiyAll(String str) {
for(Observer obser : list){
obser.update(str);
}
}
}
测试类:
package obs.observer;
public class TestMain {
public static void main(String[] args) {
Observered obed = new ConcreteObservered();
Observer obs1 = new ConcreteObserver("1");
Observer obs2 = new ConcreteObserver("2");
Observer obs3 = new ConcreteObserver("3");
obed.addObserver(obs1);
obed.addObserver(obs2);
obed.addObserver(obs3);
obed.notifiyAll("我已经更新");
System.out.println("=====================");
obed.deleteObserver(obs3);
obed.notifiyAll("删除后的值");
}
}