public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
观察者
public interface Observer {
public void execute(); //execute方法可以根据需要定义相关的传入参数,将主题中的数据传给观察者。
}
一个主题的实现
public class ConcretSubject implements Subject{
private ArrayList<Observer> observerList;
public ConcretSubject() {
observerList = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer o) {
observerList.add(o);
}
@Override
public void removeObserver(Observer o) {
observerList.remove(o);
}
@Override
public void notifyObservers() {
for(Observer observer : observerList) {
observer.execute();
}
}
}
一个观察者的实现
public class ConcretObserver implements Observer{
@Override
public void execute() {
System.out.println("Observer execute.....");
}
}
*一个测试类
public class TestObserver {
public static void main(String args []) {
Subject subject = new ConcretSubject();
Observer observer = new ConcretObserver();
subject.registerObserver(observer);
subject.notifyObservers();
}
}
观察者模式:定义了对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知并进行相应的操作。
两个角色:
主题
和观察者
,它们之间是一对多的关系。在主题
中包含有注册
,移除
观察者的操作和通知
观察者状态变化的操作。观察者
中会有相应的响应方法,用于在接收到通知后执行。代码:
*一个测试类
还记得以前学Java awt/swing的时候,接触到的事件监听模型,和观察者多少有些类似,也写在下面: