MVC

MVC 的 历史背景

MVC 框架思想的正式命名来源于 1979年左右,全程为Model-View-Controller 及模型-视图-控制器,简单来说框架思想是把项目代码的功能 按照 其思想分为不同层级,MVC 就把项目代码的功能 划分为 Model View Controller 三个层级。

Model 代表是一个独立的对象 或者多个对象的集合 一般用来提供程序所需的数据和数据的存储 同时Model 还需与View 构成观察者模式通知View 更新, View 也可主动查询Model 达到更新View 的需求

View 代表的是Model 中一些重要数据在视觉上的体现, View 可以在接收到用户事件的时候将事件传递给Controller 再由Controller 修改Model 提供观察者机制更新View

Controller 用于连接用户与系统,例如当Controllle 接收到用户的输出时,会将其转换成相应的消息,并将该消息传递给一个或多个View

image.png

MVC有多个版本的演化,但其特点是各层级之间耦合较多。

MVC 在Android 中的应用

通过下面的案例实现典型的MVC 结构,即View 接受外部事件,传递给Controller, 再由C 修改Model, Model再做出数据修改 View 注册Model 的监听,在Model 修改后 回调给View 进行View 的更新。

1、Model

public class Model {

    public Model() {
    }

    //controller 通过此方法 修改 model
    public void getContent() {
        if (mModelChangeContent  != null){
            //将新数据 传递给 Controller
            mModelChangeContent.contentChange("Model 传递过来的数据!");
        }
    }

    interface ModelChangeContent{
       void  contentChange(String content);
    }

    //Controller 通过接口 监听Model 的更新
    private ModelChangeContent mModelChangeContent;

    //Controller 通过此监听 更新 View
    public void setModelChangeContent(ModelChangeContent modelChangeContent){
        this.mModelChangeContent = modelChangeContent;
    }
}

2、View

在典型的MVC 中View 可以通过观察者模式观察Model 的更新从而刷新View ,而在安卓中View 是不可以直接对Model 产生影响的,因此这里需要扩展View 在View 中通过Controller 注册Model 的更新。


public class MyTextView extends androidx.appcompat.widget.AppCompatTextView {

    Model.ModelChangeContent mModelChangeContent;

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setModelListener(Model model,Model.ModelChangeContent modelListener) {
        model.setModelChangeContent(modelListener);
    }

}




    

    

3、Controller

public class MVPActivity extends AppCompatActivity {

    //View
    Button mButton;

    MyTextView mTextView;

    //Model
    static Model mModel;

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

    private void initView() {
        mButton = findViewById(R.id.btn_change);
        mTextView = findViewById(R.id.tv_content);

        mModel = new Model();

        mButton.setOnClickListener(v -> {
            //View Controller 接受点击事件 由Controller 修改Model
            mModel.getContent();
        });


        //View 注册 Model 的监听
        mTextView.setModelListener(mModel,new Model.ModelChangeContent() {
            @Override
            public void contentChange(String content) {
                //更新View
                mTextView.setText(content);
            }
        });
    }
}
}

MVC 总结

在安卓开发中 MVC 是很难扩展和维护的一种框架结构,在实际的开发中,Activity 中包含了model 层的请求 同时又关联了XML 代表的View 这就导致了 Activity 称为MVC 各层代码的集散地,当业务复杂后 非常难以扩展和维护,可读性也并非很好。

你可能感兴趣的:(MVC)