Android观察者设计模式

原创 2017年07月14日 10:48:03

本文主要是为了学习RxJava,Retrofit这两个比较火的框架做铺垫的!


观察者两种的实现方式

  • 自定义模式
    其实这种自定义方式,也是模仿util包下Observable、Observer的实现方式,但本文还是讲解一下,更深刻理解以下。

  • 通过重写util包下的Observable(被观察者),Observer(观察者)


图形介绍

  • 被观察者

    这里写图片描述

  • 观察者

    这里写图片描述


自定义观察者模式

  • 声明:想这种自定义观察者模式,没有什么固定的写法,看大家的自己的思维模式怎么去设计了。所以不用纠结怎么写是对的。

  • 首先,我们需要创建一个观察者的接口和被观察者的接口(或抽象类)

    1.观察者的接口:对外提供一个方法,被观察者数据发生改变时调用此方法,同步最新数据

/**
 * Created by sswl on 2017/7/13.
 * 观察者接口
 */

public interface OnserverInterface {

    void update(String s);
}

2.被观察者接口(或抽象类):提供三个方法,如上图所示

/**
 * Created by sswl on 2017/7/13.
 * @see Subject  被观察者
 */

public abstract class Subject {

    /**
     * 管理所有观察者的集合
     * */
    private ArrayList<OnserverInterface> mList =new ArrayList<>();

    /**
     * @param onserver 增加某个观察者
     * */
    public void addObserver(OnserverInterface onserver){
        mList.add(onserver);

    }
    /**删除
     * @param  onserver 移除某个观察者
     * */
    public void deleteObserver(OnserverInterface onserver){
        mList.remove(onserver);

    }

    /**
     * @param state 通知所用的观察者
     * */
    public void notify(String state){

        for (OnserverInterface o : mList) {
            o.update(state);

        }
    }
}
  • 写两个帮助类,SubjectHelp(被观察者帮助类)和OnserverHelp(观察者帮助类)

    SubjectHelp(被观察者帮助类):

public class SubjectHelp extends Subject {

    /**
     * 当被观察者需要改变数据时,可以调用change   ,
     * change调用notify通知观察者数据改变
     * */
    public void  change(String s){
        notify(s);
    }
}

OnserverHelp(观察者帮助类):

public class OnserverHelp implements OnserverInterface {

    public String name;
    public OnserverHelp(String name){
        this.name=name;
    }

    @Override
    public void update(String s) {
        //这里的s 是数据发生改变时 在change(String s)方法里调用 notify(s);而 notify(s)里用调用了update(state);,这个s就是改变的数据,一直传递过来的。
        //如果用户想要显示在界面上,可以提供一个接口,把数据传到接口里,然后Activity实现这个接口就可以从接口里获取数据了(方式之一)
        Log.e("OnserverHelp","被观察者发生数据的改变,通知观察者: "+name+"》》》"+s);
    }
}
  • 下面进行实际操作,模拟场景:用户点击一个按钮然后数据发生改变(这里为了方便只是打印的log)
  /**
     * 自定义观察者模式
     * */
    private void initdata() {
        /**
         * 多个观察者
         * */
        onserverHelp = new OnserverHelp("詹姆斯.卡梅隆");
        OnserverHelp onserverHelp1 = new OnserverHelp("莱昂纳多");
        OnserverHelp  onserverHelp2 = new OnserverHelp("阿伦.艾弗森");
        /**
         * 被观察着   (可以一对多)
         * */
        subjectHelp = new SubjectHelp();
        /**
         * 给subjectHelp 添加观察者(可以添加多个观察者)
         * */
        subjectHelp.addObserver(onserverHelp);
        subjectHelp.addObserver(onserverHelp1);
        subjectHelp.addObserver(onserverHelp2);
        /**
         * 删除某个观察者  退出界面时也可以放到onDestroy里销毁
         * */
        subjectHelp.deleteObserver(onserverHelp2);

    }

然后用户点击按钮:

 btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            //被观察者数据发生改变
                subjectHelp.change("我是被观察者Observer");
                /**Log
                 * 07-13 10:00:46.236 25525-25525/webred.cp.example.com.observerapp E/OnserverHelp: 被观察者发生数据的改变,通知观察者: 詹姆斯.卡梅隆》》》我是被观察者Observer
                 * 07-13 10:00:46.236 25525-25525/webred.cp.example.com.observerapp E/OnserverHelp: 被观察者发生数据的改变,通知观察者: 莱昂纳多》》》我是被观察者Observer
                 * */
            }
        });

这样就实现了观察者设计模式,整个流程,initdata的时候给被观察者添加了两个观察者,用户点击按钮,调用了change(String s),s就是发生改变的数据,在change方法里用调用了notify(通知观察者数据发生改变),notify里又把s传递到了update(这个方法是观察者得到最新数据的方法)


java.util包下的观察者模式

import java.util.Observable;
import java.util.Observer;
 /**
     * android 自带的观察者模式的相关类
     * Observable 抽象类
     * Observer 接口
     * */
    private void androidObserverable() {
        androidHelpObserverable = new AndroidHelpObserverable("android自带的观察者模式类");
        androidObserverHelp = new AndroidObserverHelp("麦迪TMC");
        androidHelpObserverable.addObserver(androidObserverHelp);
    }
  • 同自定义一样,我们需要写一个被观察者帮助类和观察者帮助类
    被观察者帮助类:
public class AndroidHelpObserverable extends Observable {

    public String name;
    public AndroidHelpObserverable(String s) {
        this.name=s;
    }
    /***
     * 该方法
     * */
    public void  change(){
        setChanged();//数据发生改变时,该方法返回的是true(必须调用的)
        notifyObservers();
        // notifyObservers(“也可以调用有参数的,用户可以自己传递一些数据,同自定义观察者模式的传递数据一样”);
    }

}

观察者帮助类:

/**
 * Created by sswl on 2017/7/13.
 */

public class AndroidObserverHelp implements Observer {


    public String name;
    public AndroidObserverHelp(String name){
        this.name=name;
    }

    @Override
    public void update(Observable o, Object arg) {
        AndroidHelpObserverable observerable = (AndroidHelpObserverable) o;
        Log.e("android 自带的观察者模式相关类","观察者:"+name+"..."+observerable.name);
    }
}
  • 用户点击按钮
  btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                androidHelpObserverable.change();
                /**log
                 * 07-13 10:18:42.645 30232-30232/webred.cp.example.com.observerapp E/android 自带的观察者模式相关类: 观察者:麦迪TMC...android自带的观察者模式类
                 * */
            }
        });
  • 退出界面时可以移除观察者
  @Override
    protected void onDestroy() {
        super.onDestroy();
        androidHelpObserverable.deleteObserver(androidObserverHelp);
        Log.e("退出界面时销毁:","销毁观察者");
    }

这就是观察者设计模式的两种实现方式!欢迎吐槽!


demo源码

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android观察者设计模式 下载进度同步显示

观察者设计模式简介 观察者可以用来做什么? 比如应用商店下载进度条的问题 在列表中点击下载后,会显示进度状态: 当点击详情页面时,进度条会同步: 实...

Android观察设计模式实现两个页面下载进度的同步更新

我们在下载一些应用的时候,会发现下载进度与点到应用详情界面的进度是同步的,外面的暂停,里面的也暂停,外面已完成变为安装,里面也变为安装,现在我们用观察设计模式(Observable类被观察者与Obse...
  • gewuban
  • gewuban
  • 2016年09月23日 15:39
  • 930

Android开源—RXJava观察者设计模式

简介 RxJava 是一个响应式编程框架,采用观察者设计模式。所以自然少不了 Observable 和 Subscriber 这两个东东了。 RxJava最核心的两个东西是Observables(...

浅学设计模式之观察者<Observer>模式及在android中的应用 .

最近在学习下设计模式,而加深学习的不错的方法就是把心得写出来吧。记录下自己的理解。现在自己看的书是《head.Frist设计模式》这本书。比较不错,想学习设计模式的朋友可以看下这本书。       ...
  • z_l_l_m
  • z_l_l_m
  • 2012年12月05日 19:07
  • 406

浅学设计模式之观察者<Observer>模式及在android中的应用

最近在学习下设计模式,而加深学习的不错的方法就是把心得写出来吧。记录下自己的理解。现在自己看的书是《head.Frist设计模式》这本书。比较不错,想学习设计模式的朋友可以看下这本书。        ...

设计模式In Android——观察者(Observer)模式_1

写在前面的话: 1,记录学习的过程,希望能够坚持下去。 2,代码Based On Android4.4;主要参考书籍《Head First 设计模式》 什么是观察者模式? 定义了对象之间的一对...
  • koffuxu
  • koffuxu
  • 2015年05月20日 16:46
  • 869

Android 设计模式之(三)观察者,适配器,桥接,组合模式

适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 1. 业务的接口与工作的类不兼容,(比如:类中缺少实现接口的某些方法)但又需要两者一起...

Android与设计模式——观察者(Observer)模式

Android Telephony源码中用到了大量的观察者模式,理解观察者模式,有助于我们阅读源码。...

观察者设计模式

  • 2015年12月05日 16:30
  • 1024KB
  • 下载

观察者设计模式笔记

  • 2011年12月15日 20:48
  • 152KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android观察者设计模式
举报原因:
原因补充:

(最多只允许输入30个字)