欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-25 15:50:43
...

关于Module

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

但是有一些业务模块本身功能也比较多,比如这个直播模块,我们看图:
TinyModule:一种划分业务module的解决方案
这个直播模块里面,我们根据功能大致还可以分为视频直播、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的架构进一步划分:
TinyModule:一种划分业务module的解决方案
这里划分出来的module3就是用了mvp架构。

github地址

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

相关标签: module