安卓MVC vs MVP 框架

转载请标明出处:
http://blog.youkuaiyun.com/changs_roid/article/details/50826557

概述:

当我们熟悉mvc模式后,就不难理解mvp了,mvp只是在mvc的基础上加了一个presenter层来解耦mode层和view层。下面请看一个简单的例子:

一、mvc

mvc设计图例子:
mvc设计图例子
可以看到mode、view、control层三者互相之间都有联系!

代码:

总体结构

代码块

LoginOpr.java

public interface LoginOpr {

    void login(String name,String pwd);
}

ILoginView.java

public interface ILoginView {

    void logining();

    void loginSuccess();

    void loginFail(String error);
}

LoginOprImpl.java

public class LoginOprImpl implements LoginOpr {
    private ILoginView loginView;

    public LoginOprImpl(ILoginView loginView) {
        this.loginView = loginView;
    }

    @Override
    public void login(String name, String pwd) {
        loginView.logining();
         HttpUtils.login(name, pwd, new HttpUtils.HttpListener() {
            @Override
            public void success() {
                loginView.loginSuccess();
            }

            @Override
            public void fail(String err) {
                loginView.loginFail("密码或用户名不对");
            }
        });
    }
}

LoginActivity.java

public class LoginActivity extends AppCompatActivity implements ILoginView {

    LoginOpr loginOpr;

    TextView textView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        loginOpr = new LoginOprImpl(this);

        textView = (TextView) findViewById(R.id.login);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loginOpr.login("kelly","123");
            }
        });
    }

    @Override
    public void logining() {
        textView.setText("正在登录中");
        textView.setClickable(false);
    }

    @Override
    public void loginSuccess() {
        textView.setText("登录成功,界面跳转中...");
    }

    @Override
    public void loginFail(String error) {
        textView.setText(error);
        textView.setClickable(true);
    }
}

二、mvp

mvp设计图例子:
mvp设计图例子
通过LoginPresenter来控制loginOpr和loginView。
在mode层就没有对view的引用了,各干各的。

代码:

总体结构

代码块

LoginOpr.java

public interface LoginOpr {
    void login(String name, String pwd , OnHandListener<String> listener);
}

LoginPresenter.java

public interface LoginPresenter {
    void login(String name,String pwd);
}

LoginView .java

public interface LoginView {
    void logining();

    void loginSuccess();

    void loginFail(String error);
}

LoginOprImpl.java

public class LoginOprImpl implements LoginOpr {
    @Override
    public void login(String name, String pwd, final OnHandListener<String> listener) {
        HttpUtils.login(name, pwd, new HttpUtils.HttpListener() {
            @Override
            public void success() {
                listener.success(null);
            }

            @Override
            public void fail(String err) {
                listener.fail(null,"用户名或密码错误");
            }
        });
    }
}

LoginPresenterImpl.java

public class LoginPresenterImpl implements LoginPresenter {
    LoginOpr loginOpr;
    LoginView loginView;

    public LoginPresenterImpl(LoginView loginView) {
        this.loginView = loginView;
        this.loginOpr = new LoginOprImpl();
    }

    @Override
    public void login(String name, String pwd) {
        loginView.logining();

        loginOpr.login(name, pwd, new OnHandListener<String>() {
            @Override
            public void success(String s) {
                loginView.loginSuccess();
            }

            @Override
            public void fail(String s, String error) {
                loginView.loginFail(error);
            }
        });
    }
}

LoginActivity.java

public class LoginActivity extends AppCompatActivity implements LoginView {

    LoginPresenter loginPresenter;

    TextView textView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        loginPresenter = new LoginPresenterImpl(this);

        textView = (TextView) findViewById(R.id.login);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loginPresenter.login("kelly","123");
            }
        });
    }

    @Override
    public void logining() {
        textView.setText("正在登录中");
        textView.setClickable(false);
    }

    @Override
    public void loginSuccess() {
        textView.setText("登录成功,界面跳转中...");
    }

    @Override
    public void loginFail(String error) {
        textView.setText("登录失败,请重试");
    }
}

完整demo下载地址:
http://download.youkuaiyun.com/detail/changs_roid/9455550

欢迎大家留言吐糟!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值