最近学习了设计模式中的观察者模式,在这里记录下学习成果。
观察者模式,个人理解:就是一个一对多模型,一个主体做了事情,其余多个主体都可以观察到。只不过这个主体可以决定谁去观察他,以及做什么事情可以给别人观察。
引用大师的话就是
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
下面用代码展示
1.新建接口 观察者 Observer
/** * 观察者 * @author admin * */ public interface Observer { public void update(String newState); }
观察者对象非常简单,只需一个update方法,当被观察者动作时,会通知观察者,即触发update方法
2.新建抽象类 Observable
import java.util.ArrayList; import java.util.List; public abstract class Observable { //观察者集合 private List<Observer> observerList = new ArrayList<Observer>(); public List<Observer> getObserverList() { return observerList; } public void setObserverList(List<Observer> observerList) { this.observerList = observerList; } /** * 添加观察者对象 * @param obs */ public void attach(Observer obs){ this.observerList.add(obs); } /** * 删除观察者对象 * @param obs */ public void detach(Observer obs){ this.observerList.remove(obs); } /** * 动作的时候通知所有观察者 */ public void nodifyObservers(String newState){ if(null!=observerList&&observerList.size()>0){ for(Observer obs : observerList){ obs.update(newState); } } } }
3.创建观察者的继承者 ObserverImpl
/** * 观察者的实现方法 * @author admin */ public class ObserverImpl implements Observer { /** * 当被观察者出现动作时触发 */ public void update(String newState) { System.out.println(newState); } }
4.创建被观察者的子类 ObservableEx
public class ObservableEx extends Observable { /** * 当主体发生变化时,调用通知方法 * @param newState */ public void change(String newState){ this.nodifyObservers(newState); } }
5.创建客户端
import org.junit.Test; public class Client { /** * 新建三个观察者,都把他们加到list中,然后调用change方法 */ @Test public void test(){ Observer obs1 = new ObserverImpl(); Observer obs2 = new ObserverImpl(); Observer obs3 = new ObserverImpl(); ObservableEx obse = new ObservableEx(); obse.attach(obs1); obse.attach(obs2); obse.attach(obs3); obse.change("i am eating"); } }
运行后输出
参见 http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html
http://www.blogjava.net/supercrsky/articles/202544.html