练习写好架构有助於在将来程序越做越大时,可以比较好维护程序,又或者是其他人看到这只程序的时候,也比较好进行理解,像是MVP、MVVM或者是MVC架构,那麽今天主要来做做MVP架构的部分。
MVP主要可分为三个部分,而其字母也代表不同程序分类的缩写。
Model:定义资料或向後台发送request请求
View:负责画面的显示(UI)
Presenter:负责一些逻辑上的判断
如果以图来表示的话大约是这样:
那麽接着我就实际举个例子来厘清这个架构,我会稍稍偷懒一点没用其他的资料库方法(room、retrofit等),今天主要会从主程序new一笔资料->model,那麽首先先看到程序区。
ActivityView:View的部分,用来MainActivity实作的介面。
IPresenter:presenter的interface,包含检查输入的方法。
MainActivity:主程序,发送model资料及发送view至presenter。
Model:资料区
Presenter:向Model取得资料、做逻辑判断、要求view显示对应的ui画面。
(如果是写Contract的话,就是在Contract这个interface里面写IPresenter+ActivityView的interface,主Activity继承的话就继承Contract.ActivityView,Presenter则继承Contract.IPresenter,都是可行的。)
那麽首先由Model来看,我这边定义了三笔资料(year、month、date)。
public class Model {
private String year;
private String month;
private String date;
public Model(String year,String month,String date){
this.year=year;
this.month=month;
this.date=date;
}
public String getYear() {
return year;
}
public String getMonth() {
return month;
}
public String getDate() {
return date;
}
}
public interface IPresenter {
void checkData(String Iyear,String Imonth,String Idate);//自定义用来判断资料是否为空的method
}
public class Presenter implements IPresenter{
ActivityView view;
Model model;
public Presenter(ActivityView view,Model model){//取得view及model
this.view=view;
this.model=model;
}
@Override
public void checkData(String Iyear, String Imonth, String Idate) {//从主程序输入取得model资料
if(!(Iyear.equals("")||Imonth.equals("")||Idate.equals(""))){//若值皆不为空
view.dataSuccess(Iyear,Imonth,Idate);//view的方法:dataSuccess
}
else
view.dataFail();//view有值为空的方法:dataFail
}
}
public interface ActivityView {//从presenter进行判断,并选择使用的方法
void dataSuccess(String year,String month,String date);//资料皆不为空
void dataFail();//有资料为空
}
public class MainActivity extends AppCompatActivity implements ActivityView{
Presenter presenter;
Model model;
Button button;
EditText year,month,date;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
year=findViewById(R.id.editTextDate);
month=findViewById(R.id.editTextDate2);
date=findViewById(R.id.editTextDate3);
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {//按钮按的时候
model=new Model(year.getText().toString(),month.getText().toString(),date.getText().toString());//将资料新增至model
presenter=new Presenter(MainActivity.this,model);//将view与model传至presenter
presenter.checkData(model.getYear(),model.getMonth(),model.getDate());//presenter检查资料
}
});
}
@Override
public void dataSuccess(String year,String month,String date) {//实作资料成功method
Toast.makeText(MainActivity.this,"year:"+year+"\n"
+"month:"+month+"\n"
+"date:"+date,Toast.LENGTH_SHORT).show();//成功Toast显示
}
@Override
public void dataFail() {//实作资料失败method
Toast.makeText(MainActivity.this,"有资料为空值",Toast.LENGTH_SHORT).show();//失败Toast显示
}
}
<<: Day26 [实作] 一对一视讯通话(6): 关闭镜头或麦克风
>>: 找LeetCode上简单的题目来撑过30天啦(DAY25)今天国庆放假啦
Python cv2 播Video 如有误,请指正。 VideoCapture Video file...
Day 27 Filebeat with multiple module and ELK Dashb...
上篇介绍了如何在python中模拟使用者输入, 但有些人可能觉得 Linux 的作业系统中 直接使用...
今天是三天连假的第一天,实体上课真的太累了,一不小心睡到下午诶嘿(๑´ڡ`๑)连假过完铁人也差不多完...
为什麽要用function(函式)? 通常会将statement 放在函数(function)里面,...