MVP

本文详细介绍了MVC(Model-View-Controller)和MVP(Model-View-Presenter)两种架构模式的区别与联系,并通过一个实际案例展示了如何实现MVP模式,包括其分层结构、接口定义及Presenter的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一 、MVC和MVP简介

在介绍MVP之前先来介绍下MVC,MVC(Model-View-Controller)。框架模式是Android中常用的框架模式,为了分离数据,逻辑和视图。

工作流程:View把用户操作交给Controller,Controller处理后传达给Model,Model获取数据并交给View,View更新数据。


MVC在一定程度上降低了程序的耦合度,但是View和Controller分层不是很明确,Activity可以说是Controller,但是其中又包含了和View相关的信息,Activity也是View的一部分。并且View依赖Model,但是Model不依赖于View。


MVP框架模式是对MVC的改进,MVP(Model-View-Presenter)将View和Model完全隔离。其中Presenter代替了Controller,充当View和Model之间的桥梁。

工作流程:View将用户操作交给Presenter,Presenter处理后传达给Model,Model获取数据,并交给Presenter,Presenter处理后交给View,View更新数据。


MVP实现了View与Model的完全隔离,通过面向接口的编程,进一步降低了程序的耦合性。层次清晰同时Presenter的任务也较重,MVP实现起来要比MVC复杂,其中各种接口回调也是需要一个清晰的思路。


二、怎样写一个MVP


相比MVC,MVP的层次分明,但是写起来比MVC复杂些。

接下来通过一个Demo来呈现出来,首先看我们的项目的目录结构,进行分层。



前面我们也说了,MVP完全隔离了View和Model,Presenter是两者之间的桥梁,耦合性较低,采用面向接口的编程。所以我们首先要在View和Model中定义两个接口,用来给Presenter提供操作它们的通道,通过回调机制实现数据的传递。

我们先来看Model

首先定义一个接口

public interface IGetData {

    String getData();

    void saveData(String data);
}

当然只有接口是没用的,我们得去实现这个接口,并重写方法。

public class MyGetData implements IGetData {

    @Override
    public String getData() {
//        这里可以进行一系列的数据获取操作
        String data="chendicumt";
        return data;
    }

    @Override
    public void saveData(String data) {
//        这里可以进行一系列的数据保存操作
        Log.d("------->",data);
    }
}

接下来是定义View的接口

public interface IGetDataView {

    void showViewData(String data);

    String getViewData();
}

实现View接口

public class MainActivity extends AppCompatActivity implements IGetDataView{


    private EditText editText;
    private Button button;
    private GetDataPresenter presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText=(EditText)findViewById(R.id.edit_text);
        button=(Button)findViewById(R.id.button);

        presenter=new GetDataPresenter(this);
        presenter.showData();

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                presenter.saveData();
            }
        });
    }


    @Override
    public void showViewData(String data) {
        editText.setText(data);
    }

    @Override
    public String getViewData() {
        return editText.getText().toString();
    }
}


我们可以了看到以上代码中出现了Presenter相关的信息,这里是为了实现View接口的回调,用来传递数据。

来看看Presenter的实现

public class GetDataPresenter {

    IGetData iGetData;
    IGetDataView iGetDataView;

    public GetDataPresenter(IGetDataView iGetDataView)
    {
        this.iGetDataView=iGetDataView;
        iGetData=new MyGetData();
    }


    public void saveData()
    {
        iGetData.saveData(iGetDataView.getViewData());
    }

    public void showData()
    {
        iGetDataView.showViewData(iGetData.getData());
    }
}

在Presenter中,相当于把View接口的地址放进来,同时又实现了调用Model接口,体现出桥梁的作用。


学习过程中也出现过思路不清晰的情况,多思考理一理就明白了。










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值