MVP模式编程实例

概念:

M(model) : 数据,以及数据处理逻辑
V(view) : 界面,及界面UI的显示,变化
P(presenter) : 中间人,M和V互不干涉,全靠P做交互。
简单来说,M和V的代码中,各自实现各自的逻辑,不能有对方相关代码。P的代码中,必须有MV的代码,用来二者交互。

实例:
输入城市名,查询该地的天气情况,并显示在界面上。
天气数据是虚构的,获取数据不是今天的重点,我们先用虚构的数组代替。

代码结构如下图:


MVP模式编程实例_第1张图片
code.png

效果图如下:


MVP模式编程实例_第2张图片
aaa.png

首先对于IModel.java来说,他的逻辑仅限于返回一个天气的String,所以接口中只有一个方法:

package com.xlq.demo.weathermvpdemo.model;

public interface IModel {
    String getWeather(String s);
}

而ModelImp.java 是对IModel接口的实现,逻辑非常简单,代码如下:

package com.xlq.demo.weathermvpdemo.model;

public class ModelImp implements IModel {

    private String[] mCityName = {
            "长沙", "武汉",
            "上海", "北京",
            "南京", "深圳", "合肥"};
    private String[] mWeatherStr = {
            "阴天,20~28",
            "晴天,24~30",
            "晴天,23~40",
            "中雨,15~24",
            "中雨转阴,10~18",
            "小雨转晴,22~28",
            "晴天,23~31"};

    @Override
    public String getWeather(String s) {
        for (int i=0; i < mCityName.length; i ++){
            if (s.equals(mCityName[i])){
                return mWeatherStr[i];
            }
        }
        return null;
    }
}

以上就是model的写法。

其次就是View,首先判断他需要哪些接口。

package com.xlq.demo.weathermvpdemo.view;
public interface IView {
    String getCity(); // 获得用户输入信息
    void showWeather(String s); //显示天气结果信息
    void clearMessage();  //清除信息
}

具体的实现在Activity中,详细代码如下:

public class MainActivity extends AppCompatActivity implements IView {

    Button mGetWeatherBtn,mClearBtn;
    EditText mCityName;
    TextView mWeatherShowText;
    Presenter mPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mPresenter = new Presenter(this);

        mGetWeatherBtn = findViewById(R.id.get_weather);
        mClearBtn = findViewById(R.id.clear_weather);
        mCityName = findViewById(R.id.city_name);
        mWeatherShowText = findViewById(R.id.show_weather);

        mGetWeatherBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String city = mPresenter.getCity();
                String weather = mPresenter.getWeather(city);
                mPresenter.showWeather(weather);
            }
        });

        mClearBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mPresenter.clearMessage();
            }
        });
    }

    @Override
    public String getCity() {
        return mCityName.getText().toString();
    }

    @Override
    public void showWeather(String s) {
        mWeatherShowText.setText(s);
    }

    @Override
    public void clearMessage() {
        mCityName.setText("");
        mWeatherShowText.setText("显示天气");
    }
}

Activity中需要获取到Presenter的对象,以此来调用model中的数据,所以presenter中需要有哪些方法,就可想而知了。

另外一下,也是我们之前说的,presenter中必须有IModel和IView的对象,用户交互,所以请看代码:

public class Presenter {

    IModel model;
    IView view;

    public Presenter(IView iView){
        this.view = iView;
        model = new ModelImp();
    }

    public String getWeather(String s){
        String weather = model.getWeather(s);
        if (weather == null){
            return "暂无该城市数据";
        } else {
            return weather;
        }
    }

    public void clearMessage(){
        view.clearMessage();
    }

    public String  getCity(){
        return view.getCity();
    }

    public void showWeather(String s){
        view.showWeather(s);
    }
}

好的,基本上就是上述了。

你可能感兴趣的:(MVP模式编程实例)