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

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;

    @Override

    protected 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;

    }

    @Override

    protected 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()放在“中间模块”中调用。

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

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

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

本体的内部结构与外部关系.png

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

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


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

BaseActivity.java


public abstract class BaseActivity extends Activity {

    private ActivityLifecycleListener mLifecycleListener;

    @Override

    protected 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;

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

最后

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值