zoukankan      html  css  js  c++  java
  • 观察者设计模式

    起因假设有一个场景:你需要在不同界面更新数据,然后在得到数据后在另一个界面进行操作,你会怎么做?

    UML图

    Android中EventBus为什么这么火!

    经思考你会发现,Android中Activity,Fragment,service等交互有时候是很麻烦的,你可能会说使用广播,但是使用广播其实也是很麻烦的

    你需要在A中注册/接收广播,在B中发送广播,要传递的信息---实体类还要需要实现序列化接口其实从代码层次来看是很麻烦的

    综上,EventBus,广播接收的设计都是观察者设计模式

    简单实现

    1.观察者接口及实现类

    //一个Observer接口:
    1.public interface Observer {  
    2.    public void update();  
    3.}  
    
    //两个实现类:
    1.public class Observer1 implements Observer {  
    2.  
    3.    @Override  
    4.    public void update() {  
    5.        System.out.println("observer1 has received!");  
    6.    }  
    7.}  
    1.public class Observer2 implements Observer {  
    2.  
    3.    @Override  
    4.    public void update() {  
    5.        System.out.println("observer2 has received!");  
    6.    }  
    7.  
    8.}  

    2.订阅者接口及实现类

    //订阅者接口
    public interface Subject {  
    2.      
    3.    /*增加观察者*/  
    4.    public void add(Observer observer);  
    5.      
    6.    /*删除观察者*/  
    7.    public void del(Observer observer);  
    8.      
    9.    /*通知所有的观察者*/  
    10.    public void notifyObservers();  
    11.      
    12.    /*自身的操作*/  
    13.    public void operation();  
    14.}  
    //实现接口的抽象类
    1.public abstract class AbstractSubject implements Subject {  
    2.  
    3.    private Vector<Observer> vector = new Vector<Observer>();  
    4.    @Override  
    5.    public void add(Observer observer) {  
    6.        vector.add(observer);  
    7.    }  
    8.  
    9.    @Override  
    10.    public void del(Observer observer) {  
    11.        vector.remove(observer);  
    12.    }  
    13.  
    14.    @Override  
    15.    public void notifyObservers() {  
    16.        Enumeration<Observer> enumo = vector.elements();//放入观察者的集合,并循环遍历来调用(通知)观察者的update()方法
    17.        while(enumo.hasMoreElements()){  
    18.            enumo.nextElement().update();  
    19.        }  
    20.    }  
    21.}  
    //继承抽象类的具体实现类
    1.public class MySubject extends AbstractSubject {  
    2.  
    3.    @Override  
    4.    public void operation() {  
    5.        System.out.println("update self!");  
    6.        notifyObservers();  
    7.    }  
    8.  
    9.}  

    3.测试使用

    //将所有 的观察者放入集合并调用订阅函数
    public class ObserverTest {  
    2.  
    3.    public static void main(String[] args) {  
    4.        Subject sub = new MySubject();  
    5.        sub.add(new Observer1());  
    6.        sub.add(new Observer2());  
    7.          
    8.        sub.operation();  
    9.    }  
    10.  
    11.} 

    输出结果

    update self!
    observer1 has received!
    observer2 has received!

  • 相关阅读:
    OpenSSH免密码登录SSH2
    mysql_init调用卡住原因分析
    磁盘文件读性能测试
    madvise、fadvise、posix_madvise和posix_fadvise函数的使用
    进程间传递文件描述符fd
    Orace开源的异步IO编程库,特点是接口非常简单
    爱奇艺视频窗口显示不出来解决办法
    brk/sbrk和mmap行为分析程序
    编译boost,去掉不使用的组件
    第24课 经典问题解析二
  • 原文地址:https://www.cnblogs.com/fanfusuzi/p/6847119.html
Copyright © 2011-2022 走看看