Android开发架构模型(一)IOC控制反转

前言

由浅入深,一步一步进阶,这样才能更好的书写漂亮的代码,解耦更强大,阅读Android系统源码更能得心应手。

什么是IOC

IOC中文名称是控制反转的意思,通常是包含抽象的概念,比如一个抽象方法,要由一个具体实现类来完成具体的代码,然后由底层调用,实现数据的多态化,并能大部分实现解耦的目的。

为什么要用IOC

90年代初期的系统架构都是单层的,上层应用调用底层的API来完成相应的功能,随着系统版本的迭代,系统底层的API发生较大的变动,这样上层应用调用逻辑也要做相应的改变,这就造成了很大的维护消耗,大多数系统因此死掉。

后来为了解决这个问题,就产生了IOC的数据处理理论。

常用代码解析

如:线程的使用

线程简单的使用

创建Thread对象,传入一个Runnable对象,IDE会自动补全run方法,这是因为Runnable是一个接口,里面的run方法是抽象的。

Runnable源码

再来看一下Thread的run方法,实际调用的就是Runnable的run方法,调用的代码段就是传入Runnable对象里面实现run方法的代码段。

Thread run方法源码

来看一下UML类图。

流程图

实际开发使用(一种是 定义抽象方法,一种是定义 接口并实现)

比如开发一个BaseActivity,里面有MVP,获取布局id等,可以这么实现。

  public abstract class BaseMvpActivity<V, T extends BasePresenter<V>> extends AppCompatActivity{

public BaseMvpActivity mContext;
private Toolbar mToolBarView;
private LinearLayout mView;
private TextView mGoBack;
private TextView mTitle;
private FrameLayout mBaseView;
private FrameLayout mBaseViews;
protected T     mPresenter;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ViewTools.setActivityBackGroudCoulor(this, Color.parseColor("#ffffff"));
    super.setContentView(R.layout.activity_base);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    mContext = this;
    mView = (LinearLayout) findViewById(R.id.root_view);
    mToolBarView = (Toolbar) findViewById(R.id.tb_app_bar);
    mGoBack = (TextView) findViewById(R.id.tv_toolbar_back);
    mTitle = (TextView) findViewById(R.id.tv_toolbar_title);
    mBaseView = (FrameLayout) findViewById(R.id.base_framelayout);
    int viewLayoutId = getViewLayout();
    mPresenter = createPresenter();
    if (mPresenter != null) {
        mPresenter.attachView((V) this);//因为之后所有的子类都要实现对应的View接口
    }
    if (viewLayoutId != 0) {
        View.inflate(mContext, viewLayoutId, mBaseView);
    }
    setToolBarDetail();

}

这里面有两个重要的方法:getViewLayout()和createPresenter()

     //用于创建Presenter和判断是否使用MVP模式(由子类实现)
protected abstract T createPresenter();
//获取布局id
protected abstract int getViewLayout();

下面我们来看下子类的调用:

  public class LoginActivity extends BaseMvpActivity<ILoginActivity,LoginPresenter> implements ILoginActivity{

@Override
protected int getViewLayout() {
    return R.layout.activity_login_activity;
}

@Override
protected LoginPresenter createPresenter() {
    return new LoginPresenter(mContext);
}

这样就实现了多态、代码的复用及解耦。

总结

IOC数据回调的使用有几种形式,今天介绍了两种:一种是方法传入接口,一种是在底层做抽象的方法,以后还会讲解动态设置的一种使用方案。

可加群 136705426 跟着谷歌混饭吃

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容