设计模式之观察者模式
2015-12-21 00:00
459 查看
摘要: 观察者模式又称为发布订阅模式,里面角色分为观察者,被观察者。被观察者的动作会通知给注册的观察者。
现在设计一个故事,监狱里面有犯人和警察,警察会监控犯人的一举一动。当犯人吃饭的时候,警察会收到通知。
观察者模式又称为发布订阅模式,里面角色分为观察者,被观察者。被观察者的动作会通知给注册的观察者。
现在设计一个故事,监狱里面有犯人和警察,警察会监控犯人的一举一动。当犯人吃饭的时候,警察会收到通知。
一、简单的观察者实现:
Observable:
Observer:
Criminal:
Police A:
Police B:
Test:
上面的代码非常简单,很容易看懂。Observable是对观察者的抽象,里面有个Vectory,放入的是观察者。当有观察者注册的时候就放入到Vectory里面。Crimimal继承了Observable,当犯人吃饭的时候就依次通知Vectory里面的观察者。
JDK里面本身就存在Observable和Observer两个类,方便我们直接使用观察者模式。
二、使用JDK里面观察者的实现
Criminal:
Police A:
Police B:
Test:
二、观察者模式的缺点
当某些观察者执行时间过长,会导致后面的观察者过长的延迟.
解决办法:使用异步处理,无论是在观察者端通知的步骤使用异步还是被观察者收到通知然后执行的步骤使用异步,都可以.
观察者同时也可以是被观察者。广播链太长,可维护性很差。
现在设计一个故事,监狱里面有犯人和警察,警察会监控犯人的一举一动。当犯人吃饭的时候,警察会收到通知。
观察者模式又称为发布订阅模式,里面角色分为观察者,被观察者。被观察者的动作会通知给注册的观察者。
现在设计一个故事,监狱里面有犯人和警察,警察会监控犯人的一举一动。当犯人吃饭的时候,警察会收到通知。
一、简单的观察者实现:
Observable:
public abstract class Observable { private Vector<Observer> obs = new Vector<>(); public void notifyObs(Object param) { for (Observer ob : obs) { ob.update(param); } } public void addObserver(Observer ob) { this.obs.add(ob); } public void removeObserver(Observer ob) { this.obs.remove(ob); } public int getObserverSize() { return this.obs.size(); } public boolean containObserver(Observer ob) { return this.obs.contains(ob); } }
Observer:
public interface Observer { void update(Object param); }
Criminal:
public class Criminal extends Observable { public void eat(String food) { System.out.println("criminal is eating " + food); this.notifyObs(food); } }
Police A:
public class PoliceA implements Observer { @Override public void update(Object param) { System.out.println("police A get message. param is " + param); } }
Police B:
public class PoliceB implements Observer { @Override public void update(Object param) { System.out.println("police A get message. param is " + param); } }
Test:
public class Test { public static void main(String[] args) { Criminal criminal = new Criminal(); criminal.addObserver(new PoliceA()); criminal.addObserver(new PoliceB()); criminal.eat("西餐"); } }
上面的代码非常简单,很容易看懂。Observable是对观察者的抽象,里面有个Vectory,放入的是观察者。当有观察者注册的时候就放入到Vectory里面。Crimimal继承了Observable,当犯人吃饭的时候就依次通知Vectory里面的观察者。
JDK里面本身就存在Observable和Observer两个类,方便我们直接使用观察者模式。
二、使用JDK里面观察者的实现
Criminal:
public class Criminal extends Observable { public void eat(String food) { System.out.println("criminal eat " + food); super.setChanged(); notifyObservers("criminal is eating " + food); } }
Police A:
public class PoliceA implements Observer{ @Override public void update(Observable o, Object arg) { System.out.println("Police A watch : " + arg); } }
Police B:
public class PoliceB implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("Police B watch . " + arg); System.out.println(o); } }
Test:
public class Test { public static void main(String[] args) { Criminal criminal = new Criminal(); criminal.addObserver(new PoliceA()); criminal.addObserver(new PoliceB()); criminal.eat("川菜"); } }
二、观察者模式的缺点
当某些观察者执行时间过长,会导致后面的观察者过长的延迟.
解决办法:使用异步处理,无论是在观察者端通知的步骤使用异步还是被观察者收到通知然后执行的步骤使用异步,都可以.
观察者同时也可以是被观察者。广播链太长,可维护性很差。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序