概念:
M(model) : 数据,以及数据处理逻辑
V(view) : 界面,及界面UI的显示,变化
P(presenter) : 中间人,M和V互不干涉,全靠P做交互。
简单来说,M和V的代码中,各自实现各自的逻辑,不能有对方相关代码。P的代码中,必须有MV的代码,用来二者交互。
实例:
输入城市名,查询该地的天气情况,并显示在界面上。
天气数据是虚构的,获取数据不是今天的重点,我们先用虚构的数组代替。
代码结构如下图:
效果图如下:
首先对于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);
}
}
好的,基本上就是上述了。