互联网寒冬公司倒闭后,Android事件动机模式




[](https://gitee.com/vip204888/java-p7)5.事件动机模式的原理

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



[](https://gitee.com/vip204888/java-p7)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();




[](https://gitee.com/vip204888/java-p7)5.2 事件是程序执行的动机

----------------------------------------------------------------------------



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

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

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

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

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

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



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




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

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



onClick() > HttpUtil.login();




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



[](https://gitee.com/vip204888/java-p7)5.3 子模块的内部结构与外部关系

-------------------------------------------------------------------------------



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

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

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

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



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

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

![本体的内部结构与外部关系.png](https://img-blog.csdnimg.cn/0d9ae9ec0420454390989b0ccf77d1d9.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RlZmluZWRvbmU=,size_16,color_FFFFFF,t_70#pic_center)  

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



[](https://gitee.com/vip204888/java-p7)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);

    setContentView(getLayoutResourceID());

    onCreateViewModule();

    newExternalRelations();

    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 onDestroy() {

    if (mLifecycleListener != null) {

        mLifecycleListener.onDestroy();

    }

    super.onDestroy();

}

... // onResume(), onPause(), onRequestPermissionsResult()等类似于onDestroy()一样

}




MainActivity.java



@Override

protected void newExternalRelations() {

    new MainRelations(this);

} 



BaseExternalRelations.java



public class BaseExternalRelations {

protected Activity mActivity;

public BaseExternalRelations(Activity activity) {

    mActivity = activity;

    mActivity.setLifecycleListener(newActivityLifecycleListener());

}

protected ActivityLifecycleListener newActivityLifecycleListener() {

    return new ActivityLifecycleListener(){

    };

}

}




MainRelations.java



public MainRelations(MainActivity mainActivity) {

    super(mainActivity);

    mGpsManager = new GpsManager(mainActivity.getApplicationContext());

    ...

    mGpsManager.setLocationListener(newLocationListener());

}

@Override

protected ActivityLifecycleListener newActivityLifecycleListener() {

    return new ActivityLifecycleListener() {

        @Override

        public void onModulesCreated() { // 当各个模块都创建完成、设置监听器完成后,所执行的

        ... // do something

        }

        @Override

        public void onDestroy() {

        ... // do something

        }

    };

}

... 



相当于Java桌面程序版这样的流程:



ViewManager mViewManager = new ViewManager();

new XxxExternalRelations(mViewManager);


 public XxxExternalRelations(mViewManager) {

        mViewManager.setOnVvvListener((vparam) -> {

            // 调用mViewManager, mFileManager, HttpUtil, mGpsManager, mGeocoderManager, PureCalculation

        });

        mFileManager = new FileManager();

        mGpsManager = new GpsManager();

        mGeocoderManager = new GeocoderManager();

        mFileManager.setOnFffListener((fparam) -> {

            // 调用mViewManager, mFileManager, HttpUtil, mGpsManager, mGeocoderManager, PureCalculation

        });

        mGpsManager.setOnGggListener((gparam) -> {

            // 调用mViewManager, mFileManager, HttpUtil, mGpsManager, mGeocoderManager, PureCalculation

        });

    } 

```



对于携带参数数据的情况,参数视为业务数据(业务数据的概念在“5.6 事件动机模式的数据流图”),所以参数数据的变量放在外部关系模块中:  

MainRelations.java



```

 public MainRelations(MainActivity mainActivity) {

        super(mainActivity);

        data = mActivity.getIntent().getData();

        mActivity.initViewWithData(data);

        ...

    } 

```



对于Fragment,类似的方法如下:  

XxxRelations.java



```

 public XxxRelations(XxxFragment xxxFragment) {

        super(xxxFragment);

        data = mFragment.getArguments().getData();

        mFragment.initViewWithData(data);

        ...

    } 

```



[](https://gitee.com/vip204888/java-p7)5.5 纯计算

---------------------------------------------------------------------



**数据体**:例如Java Bean、字符串、数字、byte数组、Bitmap等称之为数据体。View对象、File对象等不是数据体。  

**纯计算**:以一组数据体作为输入、一组数据体作为输出的函数,称之为纯计算。



```

[dataD, dataE] = function(dataA, dataB, dataC) 

```



在java语言中,纯计算封装为`public static`修饰的方法。第3节中的`PureCalculation`类就是一个纯计算工具类。  

**纯计算的性质**:纯计算函数执行时,数据只在内存和CPU流动,不会涉及显示屏、文件等硬件模块和View、File等软件模块。



[](https://gitee.com/vip204888/java-p7)5.6 事件动机模式的数据流图

-----------------------------------------------------------------------------



事件动机模式的数据流图:  

![事件动机模式的数据流图.png](https://img-blog.csdnimg.cn/efed57ff2b4d4b2b9f7997411bd77e70.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RlZmluZWRvbmU=,size_16,color_FFFFFF,t_70#pic_center)  

“业务数据”通过“纯计算”得到“网络模块数据”的**举例**:  

登录时,带有手机号和验证码的Bean对象通过`new Gson().toJson(bean)`转化为json字符串,json字符串可直接用于网络请求。其中Bean对象是业务数据,`new Gson().toJson(bean)`是纯计算,json字符串是网络模块数据。  

“业务数据”通过“纯计算”得到“视图模块数据”的**举例**:  



# 《MySql面试专题》

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/323d061e349a5dda0977caa8107cf4b5.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/efe888023326af51541dc45b08058c5e.png)

# 《MySql性能优化的21个最佳实践》

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/abacd1a6ffaf7f9871117f9d65b53f25.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/b69652b6f8f437369d407cda91b8557e.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/d32344e66a6bd20b21058be6c1e2c7ee.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/ce1d500b713a237936531e218ce1c2af.png)

# 《MySQL高级知识笔记》

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/b069a90ee1f07e73bf7a91620327b592.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/9ec9681469064837738581c2152089e9.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/b79ed1933e439c25eff4f9e6152f57db.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/510410b369f47c8345cf4fc1fc78c9bd.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/0f493c0e5330af145b1bb39c1c054a7f.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/38638dc947e657cb35da795e75f80ecb.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/32287c9257ead838641f594ef01c6dd2.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/65d2e99de5dd3ef2fb3eb7156e19cdcc.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/dd0ab11778edb4c7d3dc28aa823aae58.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/dc4310f3d8065b580176c867580d8396.png)

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/6f9806273794229d9aeef497a9efc7ea.png)

## 获取方式:[点击这里前往传送门](https://gitee.com/vip204888/java-p7)

JSdY-1628227449395)]

[外链图片转存中...(img-6K7LA7sX-1628227449396)]

[外链图片转存中...(img-nKo47J6g-1628227449397)]

[外链图片转存中...(img-WCK9LeWq-1628227449398)]

[外链图片转存中...(img-0r7hLvy3-1628227449399)]

[外链图片转存中...(img-uxzK5bXn-1628227449399)]

[外链图片转存中...(img-v1D59u6H-1628227449400)]

[外链图片转存中...(img-sovEjno5-1628227449401)]

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

[外链图片转存中...(img-fsa4H2I3-1628227449402)]

## 获取方式:[点击这里前往传送门](https://gitee.com/vip204888/java-p7)

**关注我,点赞本文给更多有需要的人**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值