参考资料:
观察者模式
观察者模式
设计模式 观察者模式 以微信公众服务为例
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
观察者模式(Observer)完美的将观察者和被观察的对象分离开。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
在抽象类里有一个 ArrayList 存放观察者们
解决思路:使用面向对象技术,可以将这种依赖关系弱化。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
hongyang 的微信示例 提示 java 里面对观察者模式进行了封装 java.util.Observable和java.util.Observer。
设计模式 观察者模式 以微信公众服务为例
其中每个使用者都有上图中的3条线,为了使图片清晰省略了
如上图所示,服务号就是我们的主题,使用者就是观察者。现在我们明确下功能:1、服务号就是主题,业务就是推送消息2、观察者只需要订阅主题,只要有新的消息就会送来3、当不想要此主题消息时,取消订阅4、只要服务号还在,就会一直有人订阅好了,现在我们来看看观察者模式的类图:主题接口
/** * 主题接口,所有的主题必须实现此接口 * * @author zhy * */ public interface Subject { /** * 注册一个观察着 * * @param observer */ public void registerObserver(Observer observer); /** * 移除一个观察者 * * @param observer */ public void removeObserver(Observer observer); /** * 通知所有的观察着 */ public void notifyObservers(); }和观察者接口:
/** * @author zhy 所有的观察者需要实现此接口 */ public interface Observer { public void update(String msg); }接下来3D服务号的实现类:
import java.util.ArrayList; import java.util.List; public class ObjectFor3D implements Subject { PRivate List<Observer> observers = new ArrayList<Observer>(); /** * 3D彩票的号码 */ private String msg; @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { int index = observers.indexOf(observer); if (index >= 0) { observers.remove(index); } } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(msg); } } /** * 主题更新消息 * * @param msg */ public void setMsg(String msg) { this.msg = msg; notifyObservers(); } }模拟两个使用者:
public class Observer1 implements Observer { private Subject subject; public Observer1(Subject subject) { this.subject = subject; subject.registerObserver(this); } @Override public void update(String msg) { System.out.println("observer1 得到 3D 号码 -->" + msg + ", 我要记下来。"); } } public class Observer2 implements Observer { private Subject subject ; public Observer2(Subject subject) { this.subject = subject ; subject.registerObserver(this); } @Override public void update(String msg) { System.out.println("observer2 得到 3D 号码 -->" + msg + "我要告诉舍友们。"); }可以看出:服务号中维护了所有向它订阅消息的使用者,当服务号有新消息时,通知所有的使用者。整个架构是一种松耦合,主题的实现不依赖与使用者,当增加新的使用者时,主题的代码不需要改变;使用者如何处理得到的数据与主题无关; 最后看下测试代码:
import com.zhy.pattern.observer.ObjectFor3D; import com.zhy.pattern.observer.Observer; import com.zhy.pattern.observer.Observer1; import com.zhy.pattern.observer.Observer2; import com.zhy.pattern.observer.Subject; public class Test { public static void main(String[] args) { //模拟一个3D的服务号 ObjectFor3D subjectFor3d = new ObjectFor3D(); //客户1 Observer observer1 = new Observer1(subjectFor3d); Observer observer2 = new Observer2(subjectFor3d); subjectFor3d.setMsg("20140420的3D号码是:127" ); subjectFor3d.setMsg("20140421的3D号码是:333" ); } } 输出结果:observer1 得到 3D 号码 -->20140420的3D号码是:127, 我要记下来。 observer2 得到 3D 号码 -->20140420的3D号码是:127我要告诉舍友们。 observer1 得到 3D 号码 -->20140421的3D号码是:333, 我要记下来。 observer2 得到 3D 号码 -->20140421的3D号码是:333我要告诉舍友们。设计模式-观察者模式
设计模式-观察者模式(上)
新闻热点
疑难解答