1.程序为什么要分包分层?

 借用我刚才在网上看到的一个小例子:

 "小饭店: 一个服务员搞定(接待顾客\点菜\炒菜)

大饭店:

迎宾员(是否有预定\询问吃中餐还是西餐或者烧烤等\几位用餐 \领路到指定的包间\找点菜员为顾客点菜 )

点菜员(记录顾客点餐内容\记录是否有忌口等问题\找厨师为顾客炒菜)

厨师(按照顾客菜肴清单,进行炒菜)"

看完了这个小例子想必就很清楚的知道使用框架模式的好处了吧.

2.MVC(Model-View-Controller)

View(视图层):这个很容易理解了,就是人机交互的那一层,再简单点就是界面.

Controller(控制层):对应的可以理解为Activity.

Model(模型层):所有业务逻辑的实现.

自己简单的写了个小demo

android mvvm项目 java android mvc mvp_android mvvm项目 java

 

Controller层对事件的控制

public class MainActivity extends BaseActivity implements MainModel.MainListener {

    private Button mBtn;
    private TextView mTv;
    private MainModel mainModel;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        mBtn = (Button) findViewById(R.id.btn);
        mTv = (TextView) findViewById(R.id.tv);

        mainModel = new MainModel(this);


        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mainModel.queryUserName();
            }
        });
    }

    @Override
    public void getUserName(String name) {
        mTv.setText(name);
    }
}

Model层对业务的处理

public class MainModel {

    private MainListener mListener;

    public MainModel(MainListener listener) {
        this.mListener = listener;
    }

    public void queryUserName() {
        String userName = "张三";
        mListener.getUserName(userName);
    }

    public interface MainListener {
        void getUserName(String name);
    }
}

View层就是XML了,这里就不贴了.

对于这样的框架模式其实如果较较真儿的话你会发现view的数据操作、事件处理都在Activity中进行,似乎MVC的分层也不是那么清晰了.而且与Model层耦合严重,Activity中的代码过多逻辑复杂,后期维护起来也很麻烦,所以MVP模式就顺理成章的出现了.

 

3.MVP(Model-View-Presenter)

       MV与前文一样,没啥区别,只不过中间的控制层桥梁这回换成了Presenter.M层与V层是没有直接交互的,下面直接贴上一个简单的MVP模式的代码.

包结构

android mvvm项目 java android mvc mvp_ide_02

 

 

 

 

 

 

 

View层的操作

public class MainActivity extends BaseActivity implements IMainView {

    MainPresenter mainPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        mainPresenter = new MainPresenter();
        //View初始化时进行绑定
        mainPresenter.attachView(this);
        mainPresenter.login("UserName","PassWord");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //View销毁时进行解除
        mainPresenter.detachView();
    }

    @Override
    public void loginSuccess(String msg) {
        Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
    }

    @Override
    public void loginFailure(String msg) {
        Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
    }
}

Presenter层的操作

public class MainPresenter implements MainModel.IMainListener {

    private IMainView mView;
    private MainModel mModel;

    public MainPresenter() {
        mModel = new MainModel(this);
    }

    //绑定View
    public void attachView(IMainView view) {
        this.mView = view;
    }

    //解除View
    public void detachView() {
        this.mView = null;
    }

    //判断是否绑定View
    public boolean isViewAttached() {
        return mView != null;
    }

    public void login(String userName, String passWord) {
        mModel.login(userName, passWord);
    }

    @Override
    public void loginSuccess(String msg) {
        if (isViewAttached()) {
            mView.loginSuccess(msg);
        }
    }

    @Override
    public void loginFailure(String msg) {
        if (isViewAttached()) {
            mView.loginFailure(msg);
        }
    }
}

Model层的操作,Model层通过IMainListener与Presenter层通信

public class MainModel {
    private IMainListener mListener;

    public MainModel(IMainListener listener) {
        mListener = listener;
    }

    public void login(final String userName, final String passWord) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                if (userName.equals("") && passWord.equals("")) {
                    mListener.loginSuccess("登录成功");
                } else {
                    mListener.loginFailure("登录失败");
                }
            }
        }, 2000);
    }

    public interface IMainListener {
        void loginSuccess(String msg);

        void loginFailure(String msg);
    }
}

 Presenter层通过IMainView接口与View层通信

public interface IMainView{
    void loginSuccess(String msg);

    void loginFailure(String msg);
}

以上就是一个简单的MVP模式实例,如果想再进一步提炼的话还可以再封装一层Base层,这里就不一一展示了.

       在真实项目中使用哪种模式还要视情况而定,如果比较小的项目的话可以使用MVC模式,毕竟开发起来比较快速方便,大型的项目可以使用MVP模式,虽然MVP模式看着代码冗余,但是维护起来真的不是一般的省力气,至于MVVM模式笔者本人还没有用到,以后需要的话再与大家一起分享.以上...欢迎大家指正!