代码解释很全面,复制到IDE中,可以更方便查看如何使用的

包含观察者,被观察者以及使用者

祝君早日掌握

本来想改一下这样的写法的,但想来想去还是这样好,最原始的的observer用法

package observe;import java.util.Observable;
import java.util.Observer;//TODO 总体流程:先执行具体类中的——————引用自observer的抽象change方法,
//             在执行observer中的update方法,
//             最后执行Observable中的具体设计接口,
//             被观察者通知观察者的循序是遵循“先订阅loginOutObservable.addObserver(loginoutObserver1);
//                                            loginOutObservable.addObserver(loginoutObserver3);
//                                            loginOutObservable.addObserver(loginoutObserver2);
//                                      后通知 loginOutObservable.setLoginOut(true);”的循序,//TODO 总结:1、观察者//(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。////2、被观察对象//被观察对象发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者。
public class observer {//TODO 总体说明:// Android中的观察者需要实现Observer接口,当数据发生改变时,观察者的update()方法就会被调用,被观察者继承Observable类,// 在数据发生改变时,需要调用setChanged(); this.notifyObservers(obj);这两个方法才可以通知观察者,//TODO 被观察者public abstract class LoginOutObservable extends Observable {private String userName = "admin";/*** 设置是否登出,如果是,则需要通知观察者** @param isLoginOut isLoginOut*/public void setLoginOut(boolean isLoginOut) {if (isLoginOut) {String data = "被观察者告诉你:你已经退出登录,请重新登录!";/* 注意注意注意:下面这两个方法是要同时调用的,否则不会通知观察者数据发生了变化 */setChanged();this.notifyObservers(data);onUserLoginOut("这是在被观察者内部调用的方法:" + data);}}/*** 设置用户名,如果用户名和上次的不一样,则需要通知观察者** @param name name*/public void setUserName(String name) {if (!name.equals(userName)) {this.userName = name;String data = "被观察者告诉你:用户名已经改变了!新的名字为:" + name;/* 注意注意注意:下面这两个方法是要同时调用的,否则不会通知观察者数据发生了变化 */setChanged();this.notifyObservers(data);//TODO 执行完所有订阅之后才去执行onUserNameChanged("这是在被观察者内部调用的方法:" + data);}}/*** 当用户名字发生改变时,用于在本类中将数据打印出来* <p>* 感悟:* 抽象方法,凡是继承此类的子类,都需要重写此方法* 但是我们可以再本类里调用此方法,然后实例化此类的时候,要求实现类实现本类里头的抽象方法** @param newUserName*/public abstract void onUserNameChanged(String newUserName);/*** 当用户登出时,在本类中用于将数据打印出来* <p>* 感悟:* 抽象方法,凡是继承此类的子类,都需要重写此方法* 但是我们可以再本类里调用此方法,然后实例化此类的时候,要求实现类实现本类里头的抽象方法** @param message message*/public abstract void onUserLoginOut(String message);}//TODO 观察者public abstract class LoginoutObserver implements Observer {@Overridepublic void update(Observable o, Object arg) {/* 当被观察者因为数据发生了改变,并通知了相关的观察者后,观察者将会调用此方法进行相应* 我们这里调用的是本地的抽象方法进行数据输出 */onDataChanged("观察者从被观察者中的消息:", arg);}/*** 这里给出一个抽象方法给实现类实现,然后我们会在updat()方法被调用的时候,调用这个方法,给实现类相应** @param message message* @param object  object*/public abstract void onDataChanged(String message, Object object);}public void observerTest() {/* 被观察者:登出/修改用户名类,实例 */LoginOutObservable loginOutObservable = new LoginOutObservable() {@Overridepublic void onUserNameChanged(String newUserName) {printer(newUserName);}@Overridepublic void onUserLoginOut(String message) {printer(message);}};/*观察者1:并实现了观察者类的抽象方法,实现在这里进行数据的打印输出 */LoginoutObserver loginoutObserver1 = new LoginoutObserver() {@Overridepublic void onDataChanged(String message, Object object) {printer("我是观察者1-->" + message + "," + object.toString());}};/*观察者2:并实现了观察者类的抽象方法,实现在这里进行数据的打印输出 */LoginoutObserver loginoutObserver2 = new LoginoutObserver() {@Overridepublic void onDataChanged(String message, Object object) {printer("我是观察者2-->message:" + message + "," + object.toString());}};LoginoutObserver loginoutObserver3 = new LoginoutObserver() {@Overridepublic void onDataChanged(String message, Object object) {printer("我是观察者3-->message:" + message + "," + object.toString());}};/*** 这里像是被观察者订阅了观察者,看起来是有点别扭的哈;* 就像和反射里面调用invoke方法:method.invoke(obj, args);* 具体可以参考这篇文章:* 但是不要被混淆了,最好记的一点就是:外国人说话看起来都是和中文"反过来"的*/loginOutObservable.addObserver(loginoutObserver1);loginOutObservable.addObserver(loginoutObserver3);loginOutObservable.addObserver(loginoutObserver2);/* 这里是模拟被观察者登出操作,登出了必须要通知用户重新登录啊 */loginOutObservable.setLoginOut(true);/* 这里是模拟被观察者修改了用户名操作,导致前后用户名不一致而引起数据变化了 */loginOutObservable.setUserName("tanksu");}public void printer(String content) {System.out.println(content);}
}

Android Observe相关推荐

  1. linux的android工作室,Android工作室在启动时抛出错误,linux机器

    我只是将我的Android Studio从1.5升级到2.3,我只是解压缩文件夹并复制到下载文件夹中,现在当我启动android studio时,我收到了此消息:Android工作室在启动时抛出错误, ...

  2. 结合Android去水印APP谈谈分区存储

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前言 方便个人更新微信状态,上周花半天时间编写简单的抖音去水印AP ...

  3. android 子module混淆_Android 传统(经典)蓝牙框架

    功能 支持多设备同时连接 支持观察者监听或回调方式.注意:观察者监听和回调只能取其一! 支持使用注解@RunOn控制回调线程 支持设置回调或观察者的方法默认执行线程 配置 因为使用了jdk8的一些特性 ...

  4. android组件浮动在activity上_Jetpack Hilt 依赖注入框架上手指南

    code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:LvKang-insist 链接:https://juejin.im/post/5efdff9d6fb9a07e ...

  5. Android Jetpack架构组件之 Room(使用、源码篇)

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发 ...

  6. Android MVVM 架构应用实现

    以前项目中虽然也使用MVVM架构,但由于整体框架不是我自己搭建的,导致我对于MVVM架构的整体还是很不熟悉,所以这次就自己搭建并实现一次MVVM架构. MVVM架构使用的组件有ViewModel.Li ...

  7. android DataBind LiveData ViewModel 使用详解

    1.导入android x ,升级 版本到28 implementation 'androidx.appcompat:appcompat:1.0.0'def room_version = " ...

  8. Android Jetpack组件之WorkManger使用介绍

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  9. Android Jetpack组件之 Room使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

最新文章

  1. 使用自定义色系美化JfreeChart图表
  2. 预印本平台(arXiv.org) — 免费论文库,开心学习吧~~~
  3. CodeForces - 760E Nikita and stack
  4. 如何用c 语言编写阶乘程序,求10000的阶乘(c语言代码实现)
  5. Django中object.all
  6. python学习之路(10)--难点
  7. 利用composer搭建PHP框架(四.数据库与缓存)
  8. MySQL索引的使用及注意事项
  9. [BZOJ 1799] self 同类分布
  10. 洛谷 P3152 正整数序列
  11. 关于unity商店里的隐藏组件
  12. android使用线程计时器,计时器的Android线程
  13. 怎么用计算机画外观设计图片,以实例教你如何绘制外观设计专利3D线条图
  14. qt有关tcpserver中读取数据时是否使用flush时的研究
  15. 连肝7个晚上,总结了计算机网络的知识点!(共66条)
  16. 摩尔纹的原理与产生条件
  17. Contiki介绍及参考资料
  18. 怎么看自己mysql的账号密码是多少_怎么查到mysql的账号密码是什么?
  19. 【linux】循序渐进学运维-基础篇-mount
  20. 大规模敏捷导入工具实践

热门文章

  1. GTX 1650桌面显卡、GTX 1660 Ti/GTX 1650笔记本显卡发布之后,NVIDIA同步放出了430.39版驱动程序...
  2. 怎么才能高效的打开dwg文件呢?CAD小白有什么简单的方法?
  3. 《中国式家长》v1.0.3.7女儿版 附带修改器
  4. 一个LED的N种玩法--多线程
  5. VB写的红警内存辅助-反汇编无限金币
  6. 一个刚毕业前端的年度总结
  7. MySQL创建只读用户
  8. 英文期刊催稿信模板_SCI 投稿全过程信件模板一览(Cover letter,催稿信等)
  9. 用机器学习预测,手持98k化身吃鸡大师
  10. 国外基础几何算法答与问