HeadFirst中对观察者模式的定义:观察者模式定义了对象之间的一对多的依赖,这样一来,当一个状态发生变化时,它的所有依赖者都会收到通知并自动更新。
松耦合:当两个对象时间松耦合,它们依然可以交互,但是不太清楚彼此的细节。
观察者模式提供了一种对象设计,让主题和观察者之间的松耦合。
有两种自动更细的方式,主题推送给每个观察者或者观察者从主题中拉取。
Java中内置了观察者模式,可以很方便的写出代码。
自己写了两个Demo,一个是自己实现,一个是借助Java中的实现。
Demo1:
package com.wxisme.observer;import java.util.ArrayList;import java.util.List;/** * 主题接口 * @author wxisme * */public interface Subject { ListobserverList = new ArrayList<>(); void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObserver();}
package com.wxisme.observer;/** * 观察者接口 * @author wxisme */public interface Observer { void update(Subject subject);}
package com.wxisme.observer;/** * 具体的主题对象,实现主题接口 * @author wxisme * */public class ConcreteSubject implements Subject { private int state; @Override public void registerObserver(Observer observer) { ConcreteSubject.observerList.add(observer); } @Override public void removeObserver(Observer observer) { ConcreteSubject.observerList.remove(observer); } @Override public void notifyObserver() { for(int i=0; i
package com.wxisme.observer;/** * 具体的观察者,实现观察者接口。 * @author wxisme * */public class ConcreteObserver implements Observer { private int myState; @Override public void update(Subject subject) { setMyState(((ConcreteSubject)subject).getState()); System.out.println("myState changed:" + myState); } public int getMyState() { return myState; } public void setMyState(int myState) { this.myState = myState; }}
package com.wxisme.observer;/** * 测试观察者模式 * @author wxisme */public class Demo { public static void main(String[] args) { //一个主题对应多个观察者 ConcreteSubject csbj = new ConcreteSubject(); ConcreteObserver cobs1 = new ConcreteObserver(); csbj.registerObserver(cobs1); ConcreteObserver cobs2 = new ConcreteObserver(); csbj.registerObserver(cobs2); ConcreteObserver cobs3 = new ConcreteObserver(); csbj.registerObserver(cobs3); //当主题的状态改变时,会通知每个观察者,每个观察者会做出相应的状态改变。 csbj.setState(20); System.out.println("------------------"); csbj.setState(400); }}
运行结果:
myState changed:20
myState changed:20 myState changed:20 ------------------ myState changed:400 myState changed:400 myState changed:400
package com.wxisme.javaobserver;import java.util.Observable;public class ConcreteSubject extends Observable { private int state; public int getState() { return state; } public void setState(int state) { this.state = state; setChanged(); notifyObservers(state); }}
package com.wxisme.javaobserver;import java.util.Observable;import java.util.Observer;public class ConcreteObserver implements Observer { private int myState; @Override public void update(Observable obs, Object obj) { setMyState(((ConcreteSubject)obs).getState()); System.out.println("myState changed:" + myState); } public void setMyState(int myState) { this.myState = myState; } public int getMyState() { return myState; }}
package com.wxisme.observer;/** * 测试观察者模式 * @author wxisme */public class Demo { public static void main(String[] args) { //一个主题对应多个观察者 ConcreteSubject csbj = new ConcreteSubject(); ConcreteObserver cobs1 = new ConcreteObserver(); csbj.registerObserver(cobs1); ConcreteObserver cobs2 = new ConcreteObserver(); csbj.registerObserver(cobs2); ConcreteObserver cobs3 = new ConcreteObserver(); csbj.registerObserver(cobs3); //当主题的状态改变时,会通知每个观察者,每个观察者会做出相应的状态改变。 csbj.setState(20); System.out.println("------------------"); csbj.setState(400); }}
运行结果:
myState changed:20
myState changed:20myState changed:20------------------myState changed:400myState changed:400myState changed:400