一、认识观察者模式
我们看看报纸和杂志的订阅是怎么回事:
1、报社的业务就是出版报纸。
2、向某家报社订阅报纸,只要他们有新的报纸出版,就会给你送来,只要你是他们的订户,你就会一直收到报纸。
3、当你不想在看到报纸的时候,取消订阅,他们就不会送新的报纸来。
4、只要报社还在运营,就会一直有人或单位向他们订阅报纸或取消订阅报纸。
出版者+订阅者=观察者模式
如果你了解报纸的订阅是怎么回事,其实就知道观察者模式是怎么回事,只是名字不太一样:出版者改称为“主题”(subject),订阅者改称为“观察者”(Observer)。
让一张图来看得仔细一定:
上图中鸭子对象不是观察者,所有在主题数据改变时不会被通知,像你没有订阅报纸业务,报社有新的报纸出版时也不会发给你报纸一样,如果鸭子对象想成为观察者就需要告诉主题,它想当一个观察者。通过注册(订阅)告诉主题。
观察者模式定义:
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态使,它所有的依赖对象都会收到通知并自动更新。
松耦合:当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此之间的细节。
观察者模式提供了一种对象设计,让主题和观察者之间松耦合。
设计原则:为了交互对象之间的松耦合设计而努力。
实例代码:
/** * 设计气象站 * 观察者模式: * 这是主题接口,对象使用此接口注册为观察者,或者把自己从观察者中删除 * @author Administrator * */ public abstract class Subject { /** * 通过此方法注册为观察者 * @param obj */ public abstract void registerObserver(Observer obj); /** * 通过此方法取消注册。 * @param obj */ public abstract void removeObserver(Observer obj); /** * 通过所有观察者更新信息 */ public abstract void notifyObserver(); } /** * 观察者接口,所有观察者都需要实现此接口,这样主题在需要通知观察者 * 时,有了一个共同的接口。 * */ public interface Observer { public void update(); } /** * 一个具体主题,总是实现主题接口 * 除了注册和撤销方法之外,具体主题还实现了notifyObserver方法,此方法用于在状态改变时更新所有观察者。 * @author Administrator * */ public class ConcreateSubject extends Subject { //加上一个list来记录观察者。 private ArrayList observer; public ConcreateSubject() { observer=new ArrayList(); } @Override public void registerObserver(Observer obj) { observer.add(obj); } @Override public void removeObserver(Observer obj) { observer.remove(obj); } @Override public void notifyObserver() { for (int i = 0; i < observer.size(); i++) { Observer obs=(Observer) observer.get(i); //更新所有观察者最想信息 obs.update(); } } } /** * 具体观察者 * */ public class ConcreaeObserver implements Observer { private Subject subject; /** * 可在构造函数里面注册观察者 */ public ConcreaeObserver(Subject subject) { this.subject=subject; this.subject.registerObserver(this); } @Override public void update() { // TODO Auto-generated method stub System.out.println("我是观察者1号......................."); } } /** * 具体观察者 * @author Administrator * */ public class ConcreaeObserverA implements Observer { private Subject subject; /** * 可在构造函数里面注册观察者 */ public ConcreaeObserverA(Subject subject) { this.subject=subject; this.subject.registerObserver(this); } @Override public void update() { // TODO Auto-generated method stub System.out.println("我是观察者2号......................."); } }
/** * 测试观察者模式 * 在对象之间定义一对多的依赖,这样当一个对象发生改变状态,其依赖对象都会收到通知更新状态。 * */ public class TestObserver { public static void main(String[] args) { ConcreateSubject subject = new ConcreateSubject(); ConcreaeObserver observer = new ConcreaeObserver(subject);// 注册观察者 ConcreaeObserverA observerA = new ConcreaeObserverA(subject);// 注册观察者 /*subject.registerObserver(observer);// 注册观察者 */ //subject.registerObserver(observerA);// 注册观察者 subject.notifyObserver();// 通知所有观察者更新信息 } }
输出结果:
我是观察者1号....................... 我是观察者2号.......................
Java API有内置的观察者模式。Java.util包(package)内包含基本的Observer接口与Observerable类,这和我们的subject接口与observer接口很相似,Observer接口与Observerable类使用上更方便,因为许多功能已经事先准备好了。你甚至可以使用推(push)或拉(pull)的方式传送数据。
时间: 2024-10-09 11:23:50