首页 > 其他分享 >Android 观察者模式

Android 观察者模式

时间:2023-11-24 11:05:48浏览次数:39  
标签:Observable Coder 角色 观察者 模式 DevTechFrontier 更新 Android



文章目录

  • 1、观察者模式简介
  • 2、观察者模式的定义
  • 3、观察者模式的使用场景
  • 4、观察者模式的UML 类图
  • 5、观察者模式的简单实现
  • 1)文件结构
  • 2)DevTechFrontier 被观察者 文件
  • 3) Coder 观察者 文件
  • 4) MainActivity 文件
  • 5、打印 log
  • 6、运用思路


1、观察者模式简介

观察者模式使用最多的地方是GUI系统,这个模式最多的作用就是解耦。

2、观察者模式的定义

定义对象间一对多的模式,使得没当一个对象改变状态,则所有依赖它的对象都会得到通知并更新。

3、观察者模式的使用场景

1)关联行为场景
2)事件多级触发场景
3)跨系统的消息交互场景,如消息队列、事件总线等

4、观察者模式的UML 类图

Android    观察者模式_android

  1. Subject: 抽象主题,也是被观察者角色,抽象主题角色把所有观察者对象的引用保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。

2)ConcreteSubject :具体主题,该角色将有关对象状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知,具体主题角色又叫做具体被观察者角色。

3)Observer: 抽象观察者,该角色是观察者的一个抽象类,它定义了一个抽象接口,使得在得到主题更新时提示自己。

4)ConcreteObserver: 具体的观察者,该角色实现抽象观察者角色,定义更新接口,以便在主题状态发生变化时,更新自身状态。

5、观察者模式的简单实现

我们模拟一个后台更新数据,前台更新相关操作的,观察者模式。

1)文件结构

Android    观察者模式_Android_02

1) DevTechFrontier 是我们的 被观察者,继承 Observable 类
2)Coder 是我们的 观察者 ,继承 Observer 类
3)MainActivity 主要是 对 观察者 ,被观察者的 实体化 ,同时初始化数据

2)DevTechFrontier 被观察者 文件
package com.example.lum.myobserver;

import android.util.Log;

import java.util.Observable;

/**
 * Created by lum on 2018/11/25.
 */


/*
* DevTechFrontier 这个是被观察者者角色,当它更新时,所有的观察者都会接到相应的通知
*
* */
public class DevTechFrontier extends Observable {

    private String  TAG  = "DevTechFrontier: ";

    public  void  postNewPublication(String content) {

        //······可在此处理后台数据

        Log.i(TAG,"被观察者 更新有消息更新");
        //标记状态 或者内容 发生改变
        setChanged();
        //通知所有观察者
        notifyObservers(content);
    }

}
3) Coder 观察者 文件
package com.example.lum.myobserver;

import android.util.Log;

import java.util.Observable;
import java.util.Observer;

/**
 * Created by lum on 2018/11/25.
 */


//程序员是观察者
public class Coder implements Observer {
    private String TAG  = "Coder: ";
    public String name;

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

    @Override
    public void update(Observable o, Object arg) {
        Log.i(TAG,"HI, " + name + "  DevTechFrontier 更新啦, 内容是: "  + arg);
    }

    @Override
    public  String toString () {
        return "码农: " + name ;
    }
}
4) MainActivity 文件
package com.example.lum.myobserver;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //被观察者角色
        DevTechFrontier devTechFrontier = new DevTechFrontier();

        //观察者, 创建三个观察者
        Coder coder_1 = new Coder("code_1");
        Coder coder_2 = new Coder("code_2");
        Coder coder_3 = new Coder("code_3");

        //将观察者注册到 可观察者对象的观察者列表里
        devTechFrontier.addObserver(coder_1);
        devTechFrontier.addObserver(coder_2);
        devTechFrontier.addObserver(coder_3);


        //被观察者 发布消息
        devTechFrontier.postNewPublication("被观察者发布新的 消息");

    }
}
5、打印 log

Android    观察者模式_android_03

我们可以看到被观察者改变了数据,注册的 观察者 都会在update 函数里 接收到更新

(1) ObServer 和 Observable 是JDK 的内置类型,可见观察者模式是非常重要的。
(2) 这里的Observer 是抽象的观察者角色,Coder是具体的观察者角色。
(3)Observable 对应的是抽象主题角色, DevTechFrontier 是 具体的主题角色。
(4)当 DevTechFrontier 有更新时,会遍历所有观察者(coder), 然后给这些观察者 发布更新的消息,这样就达到一对多的更新。

6、运用思路

1)一个类 继承 ObServer 作为 观察者
2)一个类继承 Observable 作为被观察者
3)将观察者 注册到 被观察者 里
4)当调用到被观察者更新的函数,就会出发观察者里的update函数
5)两个类的数据传递
被观察者 : notifyObservers(content);
观察者:update(Observable o, Object arg) ;

文献参考:
Android 源码设计模式解析与实战 第二版

本人郑重声明,本博客所编文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。


标签:Observable,Coder,角色,观察者,模式,DevTechFrontier,更新,Android
From: https://blog.51cto.com/u_15866638/8546065

相关文章

  • Android Alpha 更改图片透明度
    文章目录1、功能描述2、代码架构3、activity_main.xml文件4、alpha_out.xml透明度属性文件5、MainActivity.java逻辑功能文件1、功能描述实现图片透明度的改变点击之后两个图片透明度的改变实现方式不一样1)一个是加载anmixml文件里定义好的透明度改变动画2)一个是再代码......
  • Android 状态模式 接口的调用(interface)
    文章目录1、状态模式介绍2、状态模式的定义3、状态模式的使用场景4、状态模式的UML类图5、状态模式的简单示例6、代码结构1)TvStateOperate接口文件2)、PowerOnState开机状态下操作3)、PowerOffState关机状态下操作过程4)、PowerController电视状态设定接口5)、TvControlle......
  • Android 责任链模式
    文章目录1、责任链模式简介2、责任链的定义3、责任链的使用场景4、责任链模式的UML类图5、责任链模式的简单实现1)示例简介2)示例分析3)代码结构4)Leader文件5)GroupLeader文件6)、Director文件7)、Manager文件8)Boss文件9)、MainActivity文件10)打印log1、责任链模式简介将每个节......
  • Android 策略模式 接口的调用
    文章目录1、策略模式介绍2、使用场景3、UML类图4、策略模式的简单实现1)文件结构2)CalculateStrategy接口文件3)BusStrategy公交收费策略4)地铁收费策略5)MainActivity调用不同收费策略6)log打印1、策略模式介绍1)实现某一功能可能会有不同的算法,不同的策略。我们根据不同的实际情......
  • Android widget简介及demo
    文章目录1、简介2、文件结构3、res->xml->appwidget_info.xml4、main_activity.xml5、AndroidManifest.xml6、MyWidget.java7、WidgetService.java8、MainActivity.java1、简介实现桌面小部件2、文件结构1)appwidget_info.xml定义了widget一些属性2)AndroidManifest.xml定义w......
  • Android 动态申请 权限 permission
    文章目录1、单个权限动态申请1)文件结构2)在AndroidManifest.xml添加权限3)在代码里进行权限检查和申请2、多个权限动态申请1)在AndroidManifest.xml添加权限2)、CheckPermission文件3)在MainActivity文件里面调用CheckPermission1、单个权限动态申请以SD卡读写权限......
  • Android典型技术模块开发详解 pdf 资料
    文章目录1、介绍2、章节介绍1、介绍Android典型技术模块开发详解适合刚步入Android开发的工作者,对于Android各个模块能够很好、很全面的讲解。2、章节介绍Android典型技术模块开发详解pdfAndroid典型技术模块开发详解代码文献参考:《Android典型技术模块开发详解》......
  • Android MVC 模式的介绍 与 实战
    文章目录1、mvc框架图2、MVC在Android模式里的实现4、小结1、mvc框架图经典的mvc模式如图所示1)Model(模型层)在MVC中Model一般用来保存数据的状态,比如数据存储,网络请求。同时还与View存在一定的耦合,通过某种事件机制(比如观察者模式)通知View状态的改变来让view更......
  • Android 抽象工厂模式
    文章目录1、抽象工厂模式介绍2、抽象工厂模式的定义3、抽象工厂模式的使用场景4、抽象工厂模式的简单实现5、小结1、抽象工厂模式介绍抽象工厂模式也是创建型模式之一,抽象工厂模式起源于对不同操作系统的图形化解决方案,如不同操作系统的按钮和文本框控件及其实现。2、抽象工厂模......
  • Android 工厂方法模式
    文章目录1、工厂方法模式介绍2、工厂方法模式的定义3、使用场景4、模式的简单实现1、工厂方法模式介绍工厂方法模式(FactoryPattern),是创建型设计模式之一。工厂方法模式是一个结构比较简单的模式。2、工厂方法模式的定义就是一个用于创建对象的接口,让子类来决定实体化那个类。3......