Day25 Android - MVP架构(简易)

练习写好架构有助於在将来程序越做越大时,可以比较好维护程序,又或者是其他人看到这只程序的时候,也比较好进行理解,像是MVP、MVVM或者是MVC架构,那麽今天主要来做做MVP架构的部分。

MVP架构

MVP主要可分为三个部分,而其字母也代表不同程序分类的缩写。

  • Model:定义资料或向後台发送request请求

  • View:负责画面的显示(UI)

  • Presenter:负责一些逻辑上的判断
    如果以图来表示的话大约是这样:
    https://ithelp.ithome.com.tw/upload/images/20210912/20139259DnpqDNeSdV.png
    那麽接着我就实际举个例子来厘清这个架构,我会稍稍偷懒一点没用其他的资料库方法(room、retrofit等),今天主要会从主程序new一笔资料->model,那麽首先先看到程序区。
    https://ithelp.ithome.com.tw/upload/images/20210912/20139259Wpil6LMkla.png

  • 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)。

Model

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;
    }
}

IPresenter

public interface IPresenter {
    void checkData(String Iyear,String Imonth,String Idate);//自定义用来判断资料是否为空的method
}

Presenter实作介面

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
    }
}

View

public interface ActivityView {//从presenter进行判断,并选择使用的方法
    void dataSuccess(String year,String month,String date);//资料皆不为空
    void dataFail();//有资料为空
}

布局

https://ithelp.ithome.com.tw/upload/images/20210912/20139259C7ePOQ7k27.png

Activity主程序

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显示
    }
}

成果

https://ithelp.ithome.com.tw/upload/images/20210912/201392597jSqGCOinw.jpg


https://ithelp.ithome.com.tw/upload/images/20210912/20139259K3OMEHZ7aQ.jpg


<<:  Day26 [实作] 一对一视讯通话(6): 关闭镜头或麦克风

>>:  找LeetCode上简单的题目来撑过30天啦(DAY25)今天国庆放假啦

Python cv2 播Video

Python cv2 播Video 如有误,请指正。 VideoCapture Video file...

Day 27 Filebeat with multiple module and ELK Dashboard

Day 27 Filebeat with multiple module and ELK Dashb...

模拟使用者自动输入 for Linux

上篇介绍了如何在python中模拟使用者输入, 但有些人可能觉得 Linux 的作业系统中 直接使用...

Day 27. 过滤器 - Filter

今天是三天连假的第一天,实体上课真的太累了,一不小心睡到下午诶嘿(๑´ڡ`๑)连假过完铁人也差不多完...

Day 13 - 函式烤肉

为什麽要用function(函式)? 通常会将statement 放在函数(function)里面,...