TinyModule:一种划分业务module的解决方案

标签: module

关于Module

以mvp架构为例,在mvp中,我们一般都会根据业务功能来划分不同的模块,
比如以一个直播app来说,我们会划分为注册登录、用户信息、设置、客服、直播、IM、营收等模块。
每一个模块我们会建立对应的mvp文件。
所以在mvp架构的app中会看到很多业务模块的package,而且每个package下面都是对应mvp的三层架构模式的文件。

但是有一些业务模块本身功能也比较多,比如这个直播模块,我们看图:
在这里插入图片描述
这个直播模块里面,我们根据功能大致还可以分为视频直播、IM消息、用户、玩法、礼物、排名等功能模块。

这些功能模块有个特点:

  1. 跟直播这个业务模块相关;
  2. 每个功能又相对来说比较独立;
  3. 功能模块之间会有互通;

而且我们考虑划分出这些功能模块还有个重要的原因是,防止直播模块代码堆积导致臃肿,所以我们要分出这些功能模块,也便于平时开发代码的管理和开发人员责任划分。

解决方案

因为划分了功能模块,这些功能模块需要统一管理,比如添加、移除、互通等,我们定义一个BaseModule:

public abstract class BaseModule {

    private static final Map<Class, BaseModule> modules = new HashMap<>();

    protected View view;

    protected BaseModule(View rootView) {
        this.view = rootView;
        modules.put(getClass(), this);
    }

    protected static void initModulesView() {
        for (BaseModule roomModule : modules.values()) {
            roomModule.initView();
        }
    }

    protected static void releaseModules() {
        for (BaseModule roomModule : modules.values()) {
            roomModule.release();
        }
        modules.clear();
    }

    protected <T extends BaseModule> T getModule(Class<T> tClass) {
        BaseModule module = modules.get(tClass);
        if (module != null) {
            return (T)module;
        } else {
            throw new IllegalStateException("no " + tClass.getName() + "  instance");
        }
    }

    protected abstract void initView();

    protected abstract void release();

    protected View findViewById(int resId) {
        return view.findViewById(resId);
    }
}

这是一个抽象类,所有的功能模块必须继承它:

public class Module1 extends BaseModule{

    private TextView mTextView;

    public Module1(View rootView) {
        super(rootView);
    }

    public void hideView() {
        mTextView.setVisibility(View.GONE);
    }

    public String getContent() {
        return "this is from module1";
    }

    @Override
    protected void initView() {
        mTextView = (TextView) findViewById(R.id.tv_module1);
        mTextView.setText("Module1 loaded!");
    }

    @Override
    protected void release() {
        System.out.println("Module1 released!");
    }
}

在业务模块activity中使用这些功能模块:

public class MainActivity extends AppCompatActivity implements IModuleCallback{

    private Module1 mModule1;
    private Module2 mModule2;
    private Module3 mModule3;// with MVP

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        View search_root = findViewById(R.id.module_root);
        mModule1 = new Module1(search_root);
        mModule2 = new Module2(search_root, this);
        mModule3 = new Module3(search_root);

        BaseModule.initModulesView();
    }

    @Override
    public void onDestroy() {
        BaseModule.releaseModules();
        super.onDestroy();
    }

    public void click1(View view) {
        mModule1.hideView();
    }

    public void click2(View view) {
        mModule2.modify("123");
    }

    public void click3(View view) {
        mModule3.toastSomething();
    }

    @Override
    public void doModify(String content) {
        Toast.makeText(this, "Modify Content is: " + content, Toast.LENGTH_SHORT).show();
    }
}

扩展:module的mvp化

上面划分出来的每一个module,实际上里面还可以使用mvp的架构进一步划分:
在这里插入图片描述
这里划分出来的module3就是用了mvp架构。

github地址

https://github.com/ddnosh/android-tiny-module

版权声明:本文为ddnosh原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ddnosh/article/details/101970296