据我印象中得知,观察者模式好像是我所知道的一个最好理解的设计模式。
当时也是在看《head first》这本书的时候看到观察者模式——书中“气象观测站”的例子,其实一言以蔽之,就是那个订报的一个模式就是了!
观察者模式让多个观察者对象同时监听某一个主题对象。这个主题对象在其状态发生变化时会通知所有观察者对象,使它们能够做出响应。观察者模式又叫发布
-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
示例代码(其实很好懂的):
public abstract class Subject {
private List<Observer> list = new ArrayList<Observer>(); //注册的观察者对象
public void attach(Observer observer){ // 注册观察者对象
list.add(observer);
System.out.println("Attached an observer");
}
public void detach(Observer observer){ // 删除观察者对象
list.remove(observer);
}
public void nodifyObservers(String newState){ //通知所有注册的观察者对象
for(Observer observer : list){
observer.update(newState);
}
}
}
public class ConcreteSubject extends Subject{
private String state;
public String getState() {
return state;
}
public void change(String newState){
state = newState;
System.out.println("主题状态为: " + state);
this.nodifyObservers(state); //状态发生改变,通知各个观察者
}
}
public interface Observer {
public void update(String state); //更新的状态
}
public class ConcreteObserver implements Observer {
private String observerState; //观察者的状态
@Override
public void update(String state) {
observerState = state; //更新观察者的状态,使其与目标的状态保持一致
System.out.println("状态为: "+observerState);
}
}
public class Client {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject(); //创建主题对象
Observer observer = new ConcreteObserver(); //创建观察者对象
subject.attach(observer); //将观察者对象登记到主题对象上
subject.change("new state"); //改变主题对象的状态
}
}