观察者模式
来源:互联网 发布:删除淘宝中差评的公司 编辑:程序博客网 时间:2024/06/03 18:52
作用:
多个观察者对象同时监听某一个主题对象。主题对象状态上改变,就会通知所有的观察者。
事物之间的通信。有些事件可以通过广播的形式,但会出现突发情况。
原理:主题对象的数据在被修改的时候,会及时通知所有被观察者。
主题(被观察者,需要看他更新,某些操作时发出通知):
1.添加新的观察者,可能需要做不同的操作,给别的地方使用
2.删除观察者
3.通知所有观察者
public interface Subject{ void addObserver(Observer o); void removeObserver(Observer o); void notifyObservers();}
具体实现。public class Button implements Subject {// 所有观察者的集合private ArrayList<Observer> observers = null;public Button() {observers = new ArrayList<Observer>();}@Overridepublic void addObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}/** * 通知所有观察者 */@Overridepublic void notifyObservers() {for (Observer o : observers) { o.update();}}/** * 按钮点击事件 */public void click() {notifyObservers();}}
观察者:
有一个接口方法,来接受主题改变的通知
public interface Observer {void update();}
观察者,接收到通知,后作出相应的相应public class DisplayObserver implements Observer {@Overridepublic void update() {System.out.println("按钮被点击!我输出!");}}
执行:
public class Main {public static void main(String[] args) {Button button = new Button();DisplayObserver display = new DisplayObserver();button.addObserver(display);button.click();}}
JAVA对观察者模式,是有内置支持的。
Observable类,创建能观测到你的程序中其他部分的子类。(主题对象)当这些子类发生变化时,观察者被通知。
这个类是父类,你需要继承这个类。里面的数组不是arrayList,是Vector,说明是线程安全的。
并且对addObserver,deleteObserver 加锁synchronized。
继承之后,子类的方法中可以加,setChange()标志,已经改变,然后notifyObservers()或者notifyObserver(Object),通知全部(可传参数)
public class JAVAObservable extends Observable {public void count() {for (int i = 0; i < 20; i++) {setChanged();notifyObservers(i);}}}
观察者,必须实现Observer接口,实现update方法。
public class JAVAObserver implements Observer {@Overridepublic void update(Observable o, Object arg) {System.out.println(o.countObservers());System.out.println("参数:" + arg);}}
mainpublic static void main(String[] args) {JAVAObservable javaObservable = new JAVAObservable();JAVAObserver observer = new JAVAObserver();javaObservable.addObserver(observer);javaObservable.count();}
输出结果: 0 0
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- linux 工具集合
- 2017.3.11 NOIP2017赛前模拟考试总结
- HTTP状态码
- 使用rowid去除oracle表中的重复项
- 封装相机功能->>>>>block返回image
- 观察者模式
- BZOJ 3940 [Usaco2015 Feb] Censoring
- 解析大型.NET ERP系统 20条数据库设计规范
- 创建一个helloworld springmvc的web工程
- Code Cache满导致接口性能变慢
- 根据中序遍历和先序遍历,后序遍历创建二叉树。
- 【Linux】Linux中常用操作命令
- cocos2d3.x android和ios屏蔽多点触摸
- UI设计