TinyModule:一种划分业务module的解决方案
程序员文章站
2022-04-25 15:50:43
...
关于Module
以mvp架构为例,在mvp中,我们一般都会根据业务功能来划分不同的模块,
比如以一个直播app来说,我们会划分为注册登录、用户信息、设置、客服、直播、IM、营收等模块。
每一个模块我们会建立对应的mvp文件。
所以在mvp架构的app中会看到很多业务模块的package,而且每个package下面都是对应mvp的三层架构模式的文件。
但是有一些业务模块本身功能也比较多,比如这个直播模块,我们看图:
这个直播模块里面,我们根据功能大致还可以分为视频直播、IM消息、用户、玩法、礼物、排名等功能模块。
这些功能模块有个特点:
- 跟直播这个业务模块相关;
- 每个功能又相对来说比较独立;
- 功能模块之间会有互通;
而且我们考虑划分出这些功能模块还有个重要的原因是,防止直播模块代码堆积导致臃肿,所以我们要分出这些功能模块,也便于平时开发代码的管理和开发人员责任划分。
解决方案
因为划分了功能模块,这些功能模块需要统一管理,比如添加、移除、互通等,我们定义一个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架构。