1.概念简述

Android 简称观察者模式, GoF说道:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。

有两个重要概念:

1.1发布者:把所有观察者对象的引用保存在一个聚焦里,每一个发布者都可以有任何数量的观察者,发布者提供一个接口,可以增加和删除订阅者

1.2订阅者:得到发布者的通知,更新状态,使之与发布者的状态相协调

2.实例

在Android开发中常用的功能就是关注了,如淘宝关注店铺,商品,新浪微博中关注某一个明星,时时通知关注明星的微博发布,而这个逻辑结构就是订阅-发布者模式.

业务:一个用户关注某一个商品

2.1.创建一个发布者-商品

public class Good  extends Observable {
    public String getmGoodName() {
        return mGoodName;
    }
    public void setmGoodName(String mGoodName) {
        setChanged();
        this.mGoodName = mGoodName; }
    public Integer getmGoodPrice() {
        return mGoodPrice; }
    public void setmGoodPrice(Integer mGoodPrice) {
        setChanged();
        this.mGoodPrice = mGoodPrice;
    }
    public Good(String mGoodName, Integer mGoodPrice) {
        this.mGoodName = mGoodName;
        this.mGoodPrice = mGoodPrice;
        setChanged();
    }
    private String mGoodName = null;
    private Integer mGoodPrice =null;}

2.2.创建一个订阅者-用户

public class User implements Observer{
    private String name;
    private String msg;
    @Override
    public void update(Observable observable, Object data) {
        System.out.println("good");
        System.out.println(name+"价格为:"+msg);
    }
    public User(String name, String msg) {
        this.name = name;
        this.msg = msg;
    }
    public static void main(String[] args) {
        System.out.println("init now");
        Good good1 = new Good("Mi1",7);
        Good good2 = new Good("Mi2",8);
        User user1 = new User("Boss1","Hello");
        User user2 = new User("Boss2","Hello");
        good1.addObserver(user1);
        good1.addObserver(user2);
        good2.addObserver(user1);
        good2.addObserver(user2);
        good1.notifyObservers();
    }
}

思考:

在上述的代码中存在这样的问题,在Android实现中,使用这样的代码实现,尤其是在联网获取数据时,需要使用线程,或启动后台服务,这也是在实际开发中需要实践的问题,并用当订阅者过多时,操作更加缓慢,如何解决也是需要思考的问题。

这些问题,在Android GreenRobot EventBus以及 Google Lib guava 也提供了实现。如何解决的可以参考

参考资料:

[1]:大话设计模式

[2]:Observable与Observer

Android 订阅-发布者模式-详解的更多相关文章

  1. Android Activity 启动模式详解

    最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...

  2. 给 Android 开发者的 RxJava 详解

    我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...

  3. android ------- 开发者的 RxJava 详解

    在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github: https://github.com/ReactiveX/RxJava https://github. ...

  4. 转:给 Android 开发者的 RxJava 详解

    转自:  http://gank.io/post/560e15be2dca930e00da1083 评注:多图解析,但是我还是未看懂. 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入 ...

  5. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

  6. 【转】Linux下Android ADB驱动安装详解

    原文网址:http://blog.csdn.net/zhenwenxian/article/details/5901350 Linux下Android ADB驱动安装详解 概述 最近由于内置的合作商比 ...

  7. Android本地化资源目录详解

    我们可以设想,有两个不同分辨率的手机(320*480和480*800)要使用一些图像资源,为了使图像不失真,就需要为不同分辨率的手机指定不同的图像,为此就需要建立不同的资源目录. 在res目录中建立了 ...

  8. Android的init过程详解(一)

    Android的init过程详解(一) Android的init过程(二):初始化语言(init.rc)解析 本文使用的软件版本 Android:4.2.2 Linux内核:3.1.10 本文及后续几 ...

  9. Android开发之MdiaPlayer详解

    Android开发之MdiaPlayer详解 MediaPlayer类可用于控制音频/视频文件或流的播放,我曾在<Android开发之基于Service的音乐播放器>一文中介绍过它的使用. ...

随机推荐

  1. extern的意思

    还是在重温C++,看到extern的意思,觉得很有必要记下来. extern是用来干什么的大家想必都是很明白的. 如果有个全局变量,或者其他文件的全局变量,要在本文件或函数中使用,可以通过extern ...

  2. CEdit的简单用法

    今晚闲来无事,写篇博文聊解解闷~ CEdit这个空间类,我之前倒是用过,不过那个时候用的还比较菜,现在么,依旧比较菜~ 首先,因为我今天刚做完了一个局域网聊天软件,用的就是CEdit来显示和获取数据的 ...

  3. oracle层次查询的陷阱

    今天开发组同事找到我,说一个简单的层次查询非常慢,业务就是有一个存设备表连接关系的表,从node1连入,从node2连出,现在要找出node2的连出顺序,sql类似于: SELECT LEVEL ID ...

  4. file的这几个取得path的方法各有不同,下边说说详细的区别

    html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...

  5. IO(二)

    package com.bjsxt.io.buffered; import java.io.BufferedInputStream; import java.io.BufferedOutputStre ...

  6. 戏(细)说Executor框架线程池任务执行全过程(上)

    一.前言 1.5后引入的Executor框架的最大优点是把任务的提交和执行解耦.要执行任务的人只需把Task描述清楚,然后提交即可.这个Task是怎么被执行的,被谁执行的,什么时候执行的,提交的人就不 ...

  7. codeforces 510 C Fox And Names【拓扑排序】

    题意:给出n串名字,表示字典序从小到大,求符合这样的字符串排列的字典序 先挨个地遍历字符串,遇到不相同的时候,加边,记录相应的入度 然后就是bfs的过程,如果某一点没有被访问过,且入度为0,则把它加入 ...

  8. Warning: Using innodb_additional_mem_pool_size is DEPRECATED

    Warning: Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in future r ...

  9. toB的产品经理和toc产品经理区别

    腾讯产品经理现身说法 曾经在UC做过2年to c的app,现在在腾讯做to b的产品. 做to c产品的时候,我很瞧不起做to b产品的同学,认为他们不过是做支撑的. 后来,我参与了一个to b平台级 ...

  10. ecshop 优化_将商品详情页goods.php重命名为shangpin.php

    有人说,将商品详情页的文件名 goods.php 改一个名字,对百度收录会有帮助,也许吧,这里不讨论是否有帮助,这里只讲解如何重命名. 例如:我们将 goods.php 改为 shangpin.php ...