面试记录第二十节——(MVP讲解)

来源:互联网 发布:淘宝详情页是什么意思 编辑:程序博客网 时间:2024/06/05 19:39

一、前言

注意:MVC功能很强大,但是他也有很多不好的缺点,因为在Android中,相比传统的MVC设计模式,它的view层它对应的是我们Android中的布局XML,但是这个xml文件并不想java web端那么强大,能做的事情其实非常有限,而controller对应的activity类不仅要处理业务逻辑,他也要处理Android当中一些操作UI的功能,我们在实际开发项目中,有很多的UI操作的业务逻辑都写在了这个activity当中,但这个类明显有很多视图层所做的事情,这样就导致了controller这个层非常的冗余和厚重,为了改善这一点,我们引入了今天的重点:MVP架构。


二、MVP((Model View Presenter)定义)

答:当我们吧架构从MVC演变成MVP之后,他出现了Presenter,它的主要意思就是说,我们会将activity层视为view层,而presenter负责activity和modle层数据的交互。

  • 具体如下

M:依然是业务逻辑层和实体模型

V:对应于Activity,负责View的绘制以及用户交互。

P:负责完成View于Model间的交互


三、MVP讲解

答:MVP之所有有如此大的优势,绝对不仅仅是MVC到MVP的名字转变,他更是把我们Activity这个类和业务逻辑抽出来,将一些复杂的代码抽到presenter当中进行处理,这样的好处就是MVP的设计模式他会比MVC更加的耦合度底如下图01:
这里写图片描述

我们会发现两者的区别,MVP的Model层不会和View直接交互,他们是通过presenter层这个中介进行交互。而MVC这个架构中,视图View层和数据Model层是可以直接进行交互的。两者的对比就会发现这个差异就是MVP最大的优点。我们在Android中很重要的一点就是,你只能在主线程操作UI,所以我们吧VIew层和Modle层切开是非常合理的设计。而Presenter层必须通过接口定义才能实现


四、MVP实例

答:
这里写图片描述
- 实体类

/** * Created by Administrator on 2017/8/15. */public class User {    private String name;    private String age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getAge() {        return age;    }    public void setAge(String age) {        this.age = age;    }}
  • model层代码
/** * Created by Administrator on 2017/8/15. */public interface OnUserListener {    void onSuccess(User user);    void onError(String str);}
/** * Created by Administrator on 2017/8/15. */public interface UserBiz {    public void login(String name,String age,OnUserListener listener);}

/**
* Created by Administrator on 2017/8/15.
*/

public class UserLogin implements UserBiz{
@Override
public void login(String name, String age, OnUserListener listener) {
//这里来处理登录的数据

    Log.i("Text","2222222222222222222222");    User user = new User();    user.setAge("20");    user.setName("张三");    listener.onSuccess(user);    listener.onError("失败了");}

}

  • presenter层
/** * Created by Administrator on 2017/8/15. */public class LoginUserPresenter {    private UserLogin userBiz;    private IUserLoginView iUserLoginView;    private Handler handler=new Handler();    private Context context;    private User user ;    public LoginUserPresenter(Activity activity,IUserLoginView iUserLoginView) {        this.iUserLoginView = iUserLoginView;        this.context = activity;        userBiz = new UserLogin();        user = new User();    }    public void Login(){        userBiz.login(iUserLoginView.getUsername(), iUserLoginView.getAge(), new OnUserListener() {            @Override            public void onSuccess(User user) {                Log.i("TAG","333333333---"+user.getName());                iUserLoginView.toMainActivity();            }            @Override            public void onError(String str) {                iUserLoginView.ShowErrow();            }        });    }    public void  UserClear(){        iUserLoginView.clearUsername();    }    public void  AgeClear(){        iUserLoginView.clearAge();    }}
  • View层
/** * Created by Administrator on 2017/8/15. */public interface IUserLoginView {    String getUsername();    String getAge();    //清除用户和年龄    void clearUsername();    void clearAge();    //显示进度条和消除进度条    void ShowLoading();    void HideLoading();    //跳转到主界面    void toMainActivity();    //错误回调    void ShowErrow();    //下面还可以添加很多你自己需求的方法}
public class MainActivity extends AppCompatActivity implements IUserLoginView {    private EditText username,userage;    private Button bt_login,clear_username,clear_age;    private LoginUserPresenter loginuserpersenter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        loginuserpersenter= new LoginUserPresenter(MainActivity.this,this);        init();    }    private void init() {        username = (EditText)findViewById(R.id.username);        userage = (EditText)findViewById(R.id.userage);        bt_login = (Button)findViewById(R.id.bt_login);        clear_username = (Button)findViewById(R.id.clear_username);        clear_username.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                loginuserpersenter.UserClear();            }        });        clear_age = (Button)findViewById(R.id.clear_age);        clear_age.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                loginuserpersenter.AgeClear();            }        });        bt_login.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                loginuserpersenter.Login();            }        });    }    @Override    public String getUsername() {        return username.getText().toString();    }    @Override    public String getAge() {        return userage.getText().toString();    }    @Override    public void clearUsername() {        username.setText("");    }    @Override    public void clearAge() {        userage.setText("");    }    @Override    public void ShowLoading() {    }    @Override    public void HideLoading() {    }    @Override    public void toMainActivity() {        Log.i("TAG","1111111111---成功跳转");        Toast.makeText(MainActivity.this,"11111111111111,跳转到主界面",Toast.LENGTH_SHORT).show();    }    @Override    public void ShowErrow() {        Log.i("TAG","1111111111---失败跳转");        Toast.makeText(MainActivity.this,"22222222222222,,错误信息",Toast.LENGTH_SHORT).show();    }}
原创粉丝点击