Android事件动机模式

  • 1.事件动机模式简介

  • 2.事件动机模式的性质

  • 3.事件动机模式的Java桌面程序版

  • 4.事件动机模式的Android版

  • 5.事件动机模式的原理

    • 5.1 对方法进行拆解封装重构

    • 5.2 事件是程序执行的动机

    • 5.3 子模块的内部结构与外部关系

    • 5.4 事件动机模式Android版实现的技巧

    • 5.5 纯计算

    • 5.6 事件动机模式的数据流图

  • 6.项目举例

1.事件动机模式简介

========================================================================

事件动机模式是一种架构模式。

事件动机模式的程序包含多个子模块、一个外部关系模块和一个纯计算工具类。

常见的子模块有Activity、Dialog、Toast、Fragment、SharedPreferences、FileManager、SqliteManager、HttpUtil、LocationManager等。

2.事件动机模式的性质

=========================================================================

性质一:事件动机模式中,只存在外部关系模块调用子模块,不存在子模块调用外部关系模块,也不存在子模块调用其他子模块。

性质二:事件动机模式中,子模块只存在这六类供外部关系模块调用的方法:

  1. new XxxManager();子模块的构造器。例如new FileManager()

  2. void setListener();子模块设置监听器。例如Activity中登录按钮设置OnClickListener

  3. Data get();从子模块获取数据。例如Activity中获取编辑框内编辑的文本,再例如FileManager从文件读取文本;

  4. void set(Data);将数据刷新到子模块。例如ActivityString刷新到TextView文本框,再例如FileManager将文本保存到文件;

  5. void request(Data, OnResponseListener);子模块执行耗时任务。例如网络模块执行Http请求;

  6. 生命周期控制方法;控制子模块的生命周期。例如ActivitystartXxxActivity()mActivity.finish(),再例如mFileManager.open(filename)mFileManager.close()

3.事件动机模式的Java桌面程序版

================================================================================

任何Java桌面应用程序,都可以通过重构得到例子A这种形式的外部关系模块:

例子A:


public class XxxExternalRelations {ViewManager mViewManager;FileManager mFileManager;GpsManager mGpsManager;GeocoderManager mGeocoderManager;public XxxExternalRelations(Object param) {mViewManager = new ViewManager();mFileManager = new FileManager();mGpsManager = new GpsManager();mGeocoderManager = new GeocoderManager();mViewManager.setOnVvvListener((vparam) -> {// 调用mViewManager, mFileManager, HttpUtil, mGpsManager, mGeocoderManager, PureCalculation});mFileManager.setOnFffListener((fparam) -> {// 调用mViewManager, mFileManager, HttpUtil, mGpsManager, mGeocoderManager, PureCalculation});mGpsManager.setOnGggListener((gparam) -> {// 调用mViewManager, mFileManager, HttpUtil, mGpsManager, mGeocoderManager, PureCalculation});}} 

也就是说程序是这样执行的:先创建子模块并且给子模块设置监听器,然后等待事件的发生来执行其他代码。

4.事件动机模式的Android版

===============================================================================

任何Android程序,都可以通过重构得到下面这种形式(下面的代码都可在“项目举例”的ProgramStructureGPS_20210630.zip项目文件中阅读):

ActivityLifecycleListener.java


package org.ourmap.programstructuregps.event_motive_mode;public class ActivityLifecycleListener {public void onModulesCreated() {}public void onResume() {}public void onPause() {}public void onDestroy() {}public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {}} 

BaseActivity.java


/*** 事件动机模式的View模块*/public abstract class BaseActivity extends Activity {private ActivityLifecycleListener mLifecycleListener;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(getLayoutResourceID());onCreateViewModule();newExternalRelations(); // new ExternalRelations(this) and  setLifecycleListener(), create modules, and set listeners for modules.if (mLifecycleListener != null) {mLifecycleListener.onModulesCreated();}}protected abstract int getLayoutResourceID();protected abstract void onCreateViewModule();protected abstract void newExternalRelations();protected void setLifecycleListener(ActivityLifecycleListener activityLifecycleListener) {mLifecycleListener = activityLifecycleListener;}@Overrideprotected void onResume() {super.onResume();if (mLifecycleListener != null) {mLifecycleListener.onResume();}}... // onPause(), onDestroy(), onRequestPermissionsResult()等类似于onResume()一样} 

BaseExternalRelations.java


package org.ourmap.programstructuregps.event_motive_mode;/*** 事件动机模式的外部关系模块*/public class BaseExternalRelations<Activity extends BaseActivity> {protected Activity mActivity;public BaseExternalRelations(Activity activity) {mActivity = activity;mActivity.setLifecycleListener(newActivityLifecycleListener());}protected ActivityLifecycleListener newActivityLifecycleListener() {return new ActivityLifecycleListener(){};}} 

5.事件动机模式的原理

=========================================================================

5.1 对方法进行拆解封装重构


对方法进行拆解封装重构的例子:


void functionX() {sentenceA();functionB();functionC();}private void functionB() {sentenceD();functionE();}private void functionE() {sentenceF();}private void functionC() {sentenceG();sentenceH();} 

对方法functionX()拆解封装重构之后得到:


void functionX() {sentenceA();sentenceD();sentenceF();sentenceG();sentenceH();} 

重构之前,functionX()方法调用语句sentenceF()形成的栈是:


functionX() > functionB() > functionE() > sentenceF(); 

重构之后,functionX()方法调用语句sentenceF()形成的栈是:


functionX() > sentenceF(); 

5.2 事件是程序执行的动机


例如,点击登录按钮执行登录这个过程,是点击事件导致了登录请求的执行。

再例如,点击桌面图标启动某个App这个过程,是点击事件导致了某个Activity的创建。

再例如,应用收到一个透传的推送消息而弹出某个提示这个过程,是网络消息事件导致程序的执行。

于是得到命题一,命题一:事件是程序执行的动机。

事件是程序执行的动机,意味着程序的方法栈的栈底是一个事件方法。

例如,执行登录网络请求时,程序的方法栈是:


onClick() > requestLogin() > HttpUtil.login(); 

其中onClick()就是登录按钮的OnClickListener监听器的事件方法。

对onClick()方法进行拆解封装重构之后,requestLogin()就消除了,执行登录网络请求的方法栈变为:


onClick() > HttpUtil.login(); 

于是得到结论A,结论A:对事件方法进行拆解封装重构之后,程序调用各个子模块的方法都是事件方法。

5.3 子模块的内部结构与外部关系


对于程序,为了让每个子模块内部都不调用其他子模块(包括Android的Activity),那必然需要构建一个“中间模块”来创建和调用各个子模块。

又由5.2节中的“结论A:程序调用各个子模块的方法都是事件方法”,那么只要把事件方法都迁移到“中间模块”,就可以让程序只存在“中间模块”调用子模块。于是程序满足了性质一“事件动机模式中只存在‘中间模块’调用子模块”。

至于怎样把事件方法迁移到“中间模块”,只要将监听器的设置放在“中间模块”即可。例如将mActivity.setLoginListener()mGpsManager.setLocationListener()放在“中间模块”中调用。

如果子模块的某个监听器只调用子模块本身,那么这个监听器只需要在子模块内部创建,不需要放在“中间模块”中。

命题二:任何一个本体都具有内部结构与外部关系,一内一外构成其整体。

本体的内部结构与外部关系:

子模块的内部结构就是子模块内部的变量和方法等。由于只有“中间模块”的方法中调用了多个子模块,所以子模块的外部关系就是“中间模块”,于是将“中间模块”命名为外部关系模块。

5.4 事件动机模式Android版实现的技巧


Activity模块创建完成之后再创建外部关系模块,并把Activity传入外部关系模块的构造器中。然后在外部关系模块的构造器中优先执行mActivity.setLifecycleListener()。对于ActivityLifecycleListener,由于点击返回按钮会导致onDestroy()执行,所以将onDestroy()视为事件方法,onResume()、onRequestPermissionsResult()等也是这样,于是将这几个事件方法放在ActivityLifecycleListener监听器中。

BaseActivity.java


public abstract class BaseActivity extends Activity {private ActivityLifecycleListener mLifecycleListener;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);## 最后**码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到**又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考,**需要的可以[戳这里免费领取](https://codechina.csdn.net/m0_60958482/java-p7)**,以下是部分内容截图
ivity.java

public abstract class BaseActivity extends Activity {

private ActivityLifecycleListener mLifecycleListener;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

最后

码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考,需要的可以戳这里免费领取,以下是部分内容截图

Android事件动机模式,2021最新Java大厂面试真题大全相关推荐

  1. 勇敢猿猿不怕困难!为去大厂我把这个Java大厂面试真题刷了几十遍!(2021最新版)

    BAJT等互联网公司的高薪和福利吸引了很多工程师的加入,面试难度也水涨船高,一线互联网公司面试有哪些特点,如何更好的准备互联网公司的面试?本篇文章就针对一线大厂后端面试,从方法论到实战,帮你梳理一个J ...

  2. 学习指南!2020最新Android大厂面试真题大全,架构师必备技能

    2021新的一年,开启新的征程,回顾2020,真是太"南"了. 从年初各大厂裁员,竟然成为一件理所应当的事情,到四月份 GitHub 上"996.ICU" 引起 ...

  3. Java大厂面试真题解析大全,附详细答案解析

    01 如何理解高并发? 高并发意味着大流量,需要运用技术手段抵抗流量的冲击,这些手段好比操作流量,能让流量更平稳地被系统所处理,带给用户更好的体验. 我们常见的高并发场景有:淘宝的双11.春运时的抢票 ...

  4. 2019年7月份,阿里最新Java高频面试真题汇总,仅供参考

    来自:网络 目录 技术一面(23问) 技术二面(3大块) JAVA开发技术面试中可能问到的问题(17问) JAVA方向技术考察点(33快) 项目实战(7大块) 必会知识(48点) 面试小技巧 注意事项 ...

  5. Java面试题库,2021Java大厂面试真题

    前言 Spring 也算有多年的历史了,已成为Java应用程序开发框架的事实标准.在如此悠久的历史背景下,有人可能会认为Spring放慢了脚步,躺在了自己的荣誉簿上,再也做不出什么新鲜的东西,或者是让 ...

  6. 2023字节、腾讯、阿里等6家大厂Java开发面试真题+高频面试题总结

    又是一年求职面试旺季,不管你是新进职场小白还是职场老鸟,这些关于java程序员面试应准备的东西你都应该知道. 面试前需要准备 1. Java 八股文:了解常考的题型和回答思路: 2. 算法:刷100- ...

  7. 一起看看这些大厂面试真题查漏补缺吧,专题解析

    前言 职场的金三银四跳槽季又来了,不同的是今年比往年「冷」一些,形式更加严峻一些,大家多多少少可能都听到或看到一些信息,就是好多公司在优化裁员,作为求职者来说,面试是一道坎,很多人会恐惧面试,即使是工 ...

  8. 2020Android大厂高频面试题(字节跳动+阿里+华为+小米等20家大厂面试真题)附面经!

    Android大厂高频面试题 1.        下列哪些语句关于内存回收的说明是正确的? ( )  A. 程序员必须创建一个线程来释放内存   B.内存回收程序负责释放无用内存    C.内存回收程 ...

  9. 「我有一剑可开天门」大厂面试真题,这边建议是直接开冲

    前言 说一下,最新在重温雪中悍刀行这本小说,故此有了这么一个沙雕标题(小声bb.这本书是真的好看),这套面试题是一个粉丝总结完发给我的,本意是想让我分享出来帮助到更多的人,我整理了一下,算是比较详细, ...

最新文章

  1. Oracle数据库远程连接方式之一:不需要安装客户端软件方法!
  2. 计算机系统存数及取数方式,计算机系统结构总结2
  3. css3之border-image
  4. python语言中整数1010的二进制表示_爱校码 - Python 语言基础二
  5. 牛客多校3 - Operation Love(几何+叉积确定三点顺逆)
  6. [css] 有用过scss和sass吗?说说它们之间的区别是什么?
  7. 马化腾生日当天 微信支付居然崩溃了//(ㄒoㄒ)//
  8. Babel的使用及其工作原理
  9. 三星Galaxy Note 10系列机模曝光:开孔全面屏实锤
  10. UI效率实用素材|WEB数据可视化最佳实践
  11. 解决log4j.properties不起作用的问题
  12. python制作指定区域截图工具_用python实现选择截图区域
  13. ubuntu 20.04 不能鼠标双击打开 .desktop (桌面快捷方式图标)文件(双击变为使用文本编辑器打开)的解决办法
  14. 集合20210801
  15. Qt实现双击可编辑的QLabel,输入文本后回车确定
  16. Amdahl 定律详解
  17. 支持向量机(SVM)算法原理
  18. php访问object元素,关于object:获取PHP stdObject中的第一个元素
  19. 2018年SCI论文--整合GEO数据挖掘完整复现 八 :STRING数据库构建蛋白质相互作用网络(PPI),cytoscape软件筛选hub基因
  20. C中格式化输出%lf,输出为保留6位小数的数。

热门文章

  1. ddd 访问权限_Lind.DDD.Authorization用户授权介绍
  2. 腾讯后台面经大全(整合版)
  3. 开放式办公室不利心理健康:噪音大且效率低
  4. 业务需求近期准备深度学习下SpringCloud为加深印象提高学习效果故做此笔记以备后面复习查看之用
  5. vue学习笔记(一)
  6. Skyline系列软件(综述)
  7. python输出给定字符串中字母a出现的次数_[Python] 输出a字符串出现频率最高的字母,用到了list中的排序和Iambda...
  8. Unix时间戳(Unix timestamp)转换工具 - 站长工具
  9. 若依Ruoyi 不分离教程01-新建主子表应用
  10. 上手基金,看这一篇就够了