博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android]如何做一个崩溃率少于千分之三噶应用app(29)- 重构调用解耦
阅读量:5885 次
发布时间:2019-06-19

本文共 1900 字,大约阅读时间需要 6 分钟。

大家好,我系苍王。

以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

很多项目都是更新迭代中,才逐渐使用组件化的架构。

可以思考一下以下一些情景。
1.使用GreenDao等orm类型数据库,如果你只是使用在登录功能当中,并没涉及到其他信息存储,就因为需要获得用户对象,你是否一定要将整个对象类型下移到base module呢?

2.网络请求的时候,使用Retrofit等需要注解的框架,如果某个模块也用到这个请求,是否需要整个请求返回对象和请求封装的interface也下移呢?

想清楚以上的问题,如何能在不更改原有代码的基础上,能够正常调用同一层级的其他业务module代码呢?这就是本章介绍的内容了。

这里可以分为两种情况,一种是只涉及逻辑,不涉及界面。第二种是涉及到界面的。

首先介绍第一种做法

架构如下图
抽象类解耦设计

1.定义一个空的MBaseApi抽象类

public abstract class MBaseApi {}复制代码

2.定义一个注册类

public class ModuleApiManager {    static ModuleApiManager instance = new ModuleApiManager();    HashMap
,MBaseApi> aMap; public static ModuleApiManager getInstance(){ return instance; } private ModuleApiManager(){ aMap = new HashMap<>(); } public boolean containsApi(Class
clazz){ return aMap.containsKey(clazz); } public
T getApi(Class
clazz){ return (T) aMap.get(clazz); } public void putApi(Class
key,MBaseApi value){ aMap.put(key, value); } public void removeApi(Class
key){ aMap.remove(key); }}复制代码

3.建立模块的抽象Api class放到BaseModule当中

public abstract class PageNameApi extends MBaseApi{    public abstract String loadPageName();}复制代码

4.建立模块Ap实现类,这里PageNameCore是逻辑类,可以是静态或者是单例。

public class PageNameImpl extends PageNameApi{    @Override    public String loadPageName() {        return PageNameCore.getInstance().getName();    }}复制代码

5.在模块启动的时候调用

ModuleApiManager.getInstance().putApi(PageNameApi.class,new PageNameImpl());复制代码

倘若你定义的Impl实现类是个单例,填入单例也可以。

6.模块调用的时候

String pageName = ModuleApiManager.getInstance().getApi(PageNameApi.class).loadPageName();复制代码

这样做基本不会让原有的逻辑更改。

如果想使用更新页面逻辑,可以参考第7节的的方式。

这里通过接口的方式来,改造将BaseApi和抽象类Api改为接口,然后通过注册实现调用。

接口解耦设计

业务模块中的页面逻辑View、Activity、Fragment继承接口Api,然后通过ModuleApiManager注册,就可以使用了。

下一节将会更精彩,敬请期待!!!

冬天的清晨唤醒你的应该是梦想吧。

群号是316556016,也可以扫码进群。我在这里期待你们的加入!!!

组件化群

转载地址:http://dmlix.baihongyu.com/

你可能感兴趣的文章
应用程序日志中总是说MS DTC无法正确处理DC 升级/降级事件,是什么意思
查看>>
mybatis数据处理的几种方式
查看>>
作业2
查看>>
远程主机探测技术FAQ集 - 扫描篇
查看>>
C++中调用python函数
查看>>
Nomad添加acl认证
查看>>
“TI门外汉”网路知识笔记一 OSI参考模型
查看>>
你不需要jQuery(五)
查看>>
DatanodeDescriptor说明
查看>>
ServlertContext
查看>>
Python WOL/WakeOnLan/网络唤醒数据包发送工具
查看>>
sizeof(long)
查看>>
pxe网络启动和GHOST网克
查看>>
2.5-saltstack配置apache
查看>>
django数据库中的时间格式与页面渲染出来的时间格式不一致的处理
查看>>
增强myEclipse的提示功能
查看>>
[翻译]Protocol Buffer 基础: C++
查看>>
runloop与线程的关系
查看>>
[Bzoj2246]迷宫探险(概率+DP)
查看>>
详解消息队列的设计与使用
查看>>