MVC、MVP、MVVM模式对比总结(4)用户登录例子

前言说明

在实战项目及学习中来总结一下Android端项目构架

包括MVC、MVP、MVVM,主要针对移动Android端

该篇以Android平台用户登录为例子,用代码来描述构架模式

代码主要作理解,所以可能不完整,因为去掉一些精简方便说明

目录

1.构架基础

2.横向构架模型

3.纵向构架流程

4.用户登录例子

4. 用户登录例子

公共代码

NetHelper网络通信类

使用Retrofit+RxJava技术

NetHelper
{
    private static String baseUrl = "http://xxx/";
    private static Retrofit retrofit = null;
    private static OkHttpClient okHttpClient = null;
    private static NetService netService;

    static {
        OkHttpClient.Builder okBuilder = OkHttpClient.Builder();
        okBuilder.addInterceptor(new HttpLoggingInterceptor()
            .setLevel(HttpLoggingInterceptor.Level.BODY));
        okHttpClient = okBuilder.build();

        Retrofit.Builder builder = new Retrofit.Builder();
        retrofit = builder.baseUrl(baseUrl)
                .client(sOkHttpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        netService = sRetrofit.create(NetService.class);
    }

    public static NetService getNetService() {
        reutrn netService;
    }

    public interface NetService {
        @POST("login")
        Observable<String> login(@Query("username") username, @Query("userpass") userpass);
    }
}

用户业务UserBiz( model层)

UserBiz
{
    Observable<String> login(String username, String userpass) {
        return NetHelper.getNetService.login(username, userpass);
    }
}

MVC例子代码

布局文件

<Layout>
        <TextView id="username"/>
        <TextView id="userpass"/>
      <Button id="button" />
</Layout>

登录界面LoginActivity( view层)

LoginActivity extends Activity
{
    String username;
    String userpass; 

    void onCreate(Bundle bdle) {
        setContentView(login_layout);

        username = findById(username);
        userpass = findById(userpass);

        findById(button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                login();
            }
        });
    }

    void login() {
        new UserManager()
            .login(username, userpass)
            .subscribe(new Action1<String>() {
                @Override
                public void call(String loginResultString) {
                    if(loginResultString) {
                        Toast.makeText(getApplicationContext(),
                            username() + "--登录成功", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getApplicationContext(),
                            username() + "--登录失败", Toast.LENGTH_SHORT).show();
                    }
                }
            };
    }
}

用户管理UserManager( controller层)

UserManager
{
    Observable<String> login(String username, String userpass) {
        return new UserBiz().login(username, userpass)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
    }
}

用户业务UserBiz( model层)

查看公共代码

MVP例子代码

布局文件

<Layout>
        <TextView id="username"/>
        <TextView id="userpass"/>
      <Button id="button" />
</Layout>

登录界面LoginActivity( view层)

LoginActivity extends Activity impl IUserView
{
    String username;
    String userpass; 

    void onCreate(Bundle bdle) {
        setContentView(login_layout);

        username = findById(username);
        userpass = findById(userpass);

        findById(button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new UserPresenter(this).login()
            }
        });
    }

    @Override
    String getUserName() {
        return username;
    }
    @Override
    String getPassword() {
        return userpass;
    }

    @Override
    void showSuccess() {
        Toast.makeText(getApplicationContext(),
                username() + "--登录成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    void showFailure() {
        Toast.makeText(getApplicationContext(),
                username() + "--登录失败", Toast.LENGTH_SHORT).show();
    }

}

用户视图接口IUserView( view层)

interface IUserView
{

    String getUserName();

    String getUserPass();

    void showSuccess();

    void showFailure();
}

用户调配UserPresenter( presenter层)

UserPresenter
{
    IUserView userView;

    UserPresenter(IUserView userView) {
        this.userView = userView;
    }

    void login() {
        new UserBiz().login(userView.getUserName(), userView.getUserPass())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<String>() {
                @Override
                public void call(String loginResultString) {
                    if(loginResultString) {
                        userView.showSuccess();
                    } else {
                        userView.showFailure();
                    }
                }
            };
    }
}

用户业务UserBiz( model层)

查看公共代码

MVVM例子代码

布局文件

<layout>
    <data>
        <name="userViewModel"
         type="com.test.viewModel.UserViewModel" />
    </data>
    <layout>
        <TextView id="username"/>
        <TextView id="userpass"/>
        <Button id="button"
           onclick="@{userViewModel.login}" />
    </layout>
</layout>

登录界面LoginActivity( view层)

LoginActivity extends Activity
{
    void onCreate(Bundle bdle) {
      MainBinding binding = DataBindingUtil.setContentView(this, login_layout);
      binding.setViewModel(new UserViewModel(binding, this));
    }
}

用户视图模型UserViewModel( viewModel层)

UserViewModel
{
    String username;
    String userpass;

    Context context;

    UserViewModel(MainBinding mainBinding, Context context) {
      this.context = context;
      username = mainBinding.username.getText().toString.trim();
      userpass = mainBinding.userpass.getText().toString.trim();
    }

    void login() {
        new UserBiz().login(username, userpass)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<String>() {
                @Override
                public void call(String loginResultString) {
                    if(loginResultString) {
                        Toast.makeText(context,
                            username + "--登录成功", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(context,
                            username + "--登录失败", Toast.LENGTH_SHORT).show();
                    }
                }
            };
    }
}

用户业务UserBiz( model层)

查看公共代码

时间: 2024-10-27 17:30:52

MVC、MVP、MVVM模式对比总结(4)用户登录例子的相关文章

浅析前端开发中的 MVC/MVP/MVVM 模式

MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类问题而总结出的抽象方法,一种架构模式往往使用了多种设计模式. 要了解MVC.MVP和MVVM,就要知道它们的相同点和不同点.不同部分是C(Controller).P(Presenter).VM(View-Model),而相同的部分则是MV(Model-View). Model&View 这里有一个可

Android MVC,MVP,MVVM模式入门——重构登陆注册功能

一  MVC模式: M:model,业务逻辑 V:view,对应布局文件 C:Controllor,对应Activity 项目框架: 代码部分: layout文件(适用于MVC和MVP两个Demo): <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" and

Android App的设计架构:MVC,MVP,MVVM与架构经验谈

来源: Android App的设计架构:MVC,MVP,MVVM与架构经验谈 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于App的架构如何设计: 我的App需要应用这些设计架构吗? MVC,MVP等架构讲的是什么?区别是什么? 本文就来带你分析一下这几个架构的特性,优缺点,以及App架构设计中应该注意的问题. 1.架构设计的目的 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使得程序在开发的过程中,开发人员

[转]MVVM架构~mvc,mvp,mvvm大话开篇

MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller. 在MVC里,View是可以直接访问

MVC, MVP, MVVM比较以及区别(上)

原文:MVC, MVP, MVVM比较以及区别(上) MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下对于这三种模式思想的理解,以及它们的区别.欢迎各位高手拍砖. 阅读目录: 一. MVC, MVP, MVVM诞生的需求? 二. 一段典型的耦合代码 三. MVC模式 3.1 主动MVC 3.2 被动MVC 3.3 Web应用中的MVC框架 3.4

MVC, MVP, MVVM比较以及区别

MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下对于这三种模式思想的理解,以及它们的区别.欢迎各位高手拍砖. 阅读目录: 一. MVC, MVP, MVVM诞生的需求? 二. 一段典型的耦合代码 三. MVC模式 3.1 主动MVC 3.2 被动MVC 3.3 Web应用中的MVC框架 3.4 MVC总结 一,MVC, MVP, MVVM诞生的需

转: GUI应用程序架构的十年变迁:MVC,MVP,MVVM,Unidirectional,Clean

十年前,Martin Fowler撰写了 GUI Architectures 一文,至今被奉为经典.本文所谈的所谓架构二字,核心即是对于对于富客户端的 代码组织/职责划分 .纵览这十年内的架构模式变迁,大概可以分为MV*与Unidirectional两大类,而Clean Architecture则是以严格的层次划分独辟蹊径.从笔者的认知来看,从MVC到MVP的变迁完成了对于View与Model的解耦合,改进了职责分配与可测试性.而从MVP到MVVM,添加了View与ViewModel之间的数据绑

MVC,MVP,MVVM

复杂的软件必须有清晰合理的架构,否则无法开发和维护. MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用.它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了. 昨天晚上,我读了<Scaling Isomorphic Javascript Code>,突然意识到,它们的区别非常简单.我用几段话,就可以说清. (题图:摄于瓦伦西亚,西班牙,2014年8月) 一.MVC MVC模式的意思是,软件可以分成三个部分. 视图(V

MVC , MVP , MVVM【转 阮一峰的网络日志】

一.MVC MVC模式的意思是,软件可以分成三个部分. 视图(View):用户界面. 控制器(Controller):业务逻辑 模型(Model):数据保存 各部分之间的通信方式如下. View 传送指令到 Controller Controller 完成业务逻辑后,要求 Model 改变状态 Model 将新的数据发送到 View,用户得到反馈 所有通信都是单向的. 二.互动模式 接受用户指令时,MVC 可以分成两种方式.一种是通过 View 接受指令,传递给 Controller. 另一种是