MVC和MVP的区别

MVC(Model View Controller),Model就是模型、View是视图、Controller就是控制器,(对应于Activity)。
Model在MVC架构中是真正的业务逻辑实现层,所以Model实际上是Business Model(业务模型)。而Controller主要负责把View的请求转发给Model,再把Model处理结果通知给View,Controller是用来解耦View和Model的,目的就是实现UI和逻辑的分离。
在实际的程序中,数据绑定、事件的处理都是在Activity中,导致Activity很复杂。此外,MVC的设计思想是从Model出发,没有考虑到View端的复杂性,这样的结果就是Model难以负荷复杂多变的View端。
MVP(Model View Presenter),其中presenter完全将Model和View进行分离,主要的逻辑程序在Presenter中实现。而且Presenter与具体的View没有直接的关联,而是通过定义好的接口进行交互,从而在保证Presenter的不变,即重用。在MVP中可以修改视图而不影响模型,所有的交互都发生在presenter内部。
MVP相对于MVC的好处:MVC中允许View和Model交互,而在MVC中两者之间的交互时通过presenter完成的。

通过例子学习:
布局:
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical">   <RelativeLayout  android:layout_width="match_parent" android:layout_height="wrap_content" >       <TextView  android:id="@+id/name_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:text="用户名" />       <EditText  android:id="@+id/name_edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/name_text"/>   </RelativeLayout>    <RelativeLayout  android:layout_width="match_parent" android:layout_height="wrap_content" >        <TextView  android:id="@+id/password_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:text=" 密码 " />        <EditText  android:id="@+id/password_edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/password_text"/>    </RelativeLayout>    <RelativeLayout  android:layout_width="match_parent" android:layout_height="wrap_content" >        <Button  android:id="@+id/login_button" android:layout_width="120dp" android:layout_height="wrap_content" android:text="Login" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:layout_marginStart="39dp" />        <Button  android:id="@+id/clear_button" android:layout_width="120dp" android:layout_height="wrap_content" android:text="Clear" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" android:layout_marginEnd="34dp"/>    </RelativeLayout>    <ProgressBar  android:id="@+id/progressBar" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>

Model:
User

public class User {    private String userName;    private String password;    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }}

IUserBiz

public interface IUserBiz {    public void login(String userName,String password,OnLoginListener loginListener);}

OnLoginListener:

public interface OnLoginListener {    void loginSuccess(User user);    void loginFailed();}

UserBiz

public class UserBiz implements IUserBiz {    @Override    public void login(final String userName, final String password, final OnLoginListener loginListener) {        new Thread(new Runnable() {            @Override            public void run() {                if("lcy".equals(userName)&&"123".equals(password)){                    User user=new User();                    user.setPassword(password);                    user.setUserName(userName);                    loginListener.loginSuccess(user);                }else{                    loginListener.loginFailed();                }            }        }).start();    }}

View:
IUserView

public interface IUserLoginView {    String getUserName();    String getPassWord();    void clearUserName();    void clearPassWord();    void showLoading();    void hideLoading();    void toMainActivity(User user);    void showFailedError();}

MainActivity

public class MainActivity extends AppCompatActivity implements IUserLoginView{    private EditText nameText;    private EditText passwordText;    private Button loginButton;    private Button clearButton;    private ProgressBar progressBar;    private UserLoginPresenter userLoginPresenter=new UserLoginPresenter(this);    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initViews();    }    void initViews(){        nameText= (EditText) findViewById(R.id.name_edit);        passwordText=(EditText)findViewById(R.id.password_edit);        loginButton=(Button)findViewById(R.id.login_button);        clearButton=(Button)findViewById(R.id.clear_button);        progressBar=(ProgressBar)findViewById(R.id.progressBar);        loginButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                 userLoginPresenter.login();            }        });        clearButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                 userLoginPresenter.clear();            }        });    }    @Override    public String getUserName() {        return nameText.getText().toString();    }    @Override    public String getPassWord() {        return passwordText.getText().toString();    }    @Override    public void clearUserName() {         nameText.setText("");    }    @Override    public void clearPassWord() {        passwordText.setText("");    }    @Override    public void showLoading() {        progressBar.setVisibility(View.VISIBLE);    }    @Override    public void hideLoading() {       progressBar.setVisibility(View.GONE);    }    @Override    public void toMainActivity(User user) {        Toast.makeText(this, user.getUserName() +                " login success , to MainActivity", Toast.LENGTH_SHORT).show();    }    @Override    public void showFailedError() {        Toast.makeText(this,                "login failed", Toast.LENGTH_SHORT).show();    }}

Presenter

public class UserLoginPresenter {    private IUserLoginView userLoginView;    private IUserBiz userBiz;    private Handler mHandler=new Handler();    public UserLoginPresenter(IUserLoginView userLoginView){        this.userLoginView=userLoginView;        this.userBiz=new UserBiz();    }    public void login(){        userLoginView.showLoading();        userBiz.login(userLoginView.getUserName(), userLoginView.getPassWord(), new OnLoginListener() {            @Override            public void loginSuccess(final User user) {                mHandler.post(new Runnable() {                    @Override                    public void run() {                        userLoginView.toMainActivity(user);                        userLoginView.hideLoading();                    }                });            }            @Override            public void loginFailed() {                   mHandler.post(new Runnable() {                       @Override                       public void run() {                           userLoginView.showFailedError();                           userLoginView.hideLoading();                       }                   });            }        });    }    public void clear(){        userLoginView.clearPassWord();        userLoginView.clearUserName();    }}

参考:http://www.cnblogs.com/JustRun1983/p/3727560.html
http://blog.csdn.net/lmj623565791/article/details/46596109

更多相关文章

  1. android中scrollTo和scrollBy的理解~~
  2. DrawerLayout-侧滑菜单
  3. Android动画详解(属性动画、视图动画和帧动画)
  4. android 触摸事件传递机制
  5. 【android】利用getViewTreeObserver().addOnGlobalLayoutListen
  6. Android(安卓)屏幕(View)坐标系统
  7. Android网络编程基础(一) - 基础知识
  8. Android实用视图动画及工具系列之三:表情加载动画和失败加载动画,
  9. Developers 设计之二 材料设计【翻译】

随机推荐

  1. android 1.6中LinearLayout getBaseline
  2. android UI进阶之style和theme的使用
  3. 图文并茂的android之SpannableString
  4. 使用谷歌提供的支持库(Android)
  5. android之图像处理、缩放、修改图片、绘
  6. 在eclipse中查看android源码
  7. android设置Activity背景色为透明的3种方
  8. android Java开发设计模式及在android中
  9. Android中关于Volley的使用(一)加载图片
  10. Android 开发者的 Flutter(三) —— Flutte