欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android架构设计之MVC模式

程序员文章站 2023-01-28 13:56:46
vc基本概念">一、mvc基本概念 mvc(model-view-controller,模型-视图-控制器)模式在android中曾经是比较流行的架构设计模式;使用mvc设计模式的好处ui界面与业务...

mvc(model-view-controller,模型-视图-控制器)模式在android中曾经是比较流行的架构设计模式;使用mvc设计模式的好处ui界面与业务逻辑数据的分离,在修改或者优化界面及用户交互的同时,无需重新编写业务逻辑。android中的mvc的角色如下:

模型层(model):是用进行业务逻辑的处理,比如一些网络访问操作、的操作等等,总之一些耗时操作的任务。 视图图(view):主要是处理数据显示的部分,在android中xml布局就可以视为v层。 控制层(controller):在android中,activity是处理用户交互问题,因此通常把activity或者fragment视为控制器,通过c层来操作m层获取数据,并把数据返回给v层显示

二、mvc基本使用

项目目录结构分成了三个目录,分别是model、controller、listener,其中model目录下存放一些javabean类和业务数据获取接口及其实现类(网络访问);controller目录存放activity或者fragment;listener目录下是存放网络访问操作结果的回调接口,目的是将数据返回给view层显示。下面一个简单登录为例:
Android架构设计之MVC模式

loginlistener接口:其实这个接口实现回调也相当于model层中一部分。

/**
 * desc:登录回调监听
 */

public interface loginlistener {

    /*请求前一些准备,比如加载提示等待*/
    void onstart_();

    /*访问成功调用*/
    void onsuccess(t t);

    /*访问失败*/
    void onfailed();

    /*访问结束*/
    void onfinish();

}

model层:

/**
 * desc: 用户信息实体类
 */

public class userinfo {

    private string username;

    private string sex;

    public string getusername() {
        return username;
    }

    public void setusername(string username) {
        this.username = username;
    }

    public string getsex() {
        return sex;
    }

    public void setsex(string sex) {
        this.sex = sex;
    }
}
/**
 * desc: login-model
 */

public interface loginmodel{

    void getuserinfo(string username, string pwd, loginlistener listener);
}
/**
 * desc:loginmodel的实现类,网络异步访问
 */

public class loginmodelimpl implements loginmodel{

    @override
    public void getuserinfo(string username, string pwd, loginlistener listener) {

        userinfo userinfo = new userinfo();
        userinfo.setusername(username);
        //下面是模拟网络访问结果的调用
        listener.onstart_();
        if (!textutils.isempty(username) && !textutils.isempty(pwd)){
            listener.onsuccess(userinfo);
        }else {
            listener.onfailed();
        }
        listener.onfinish();

    }


}

view层:xml布局





    

    

controller层:

public class mainactivity extends appcompatactivity implements loginlistener {

    private edittext metname;
    private edittext metpassword;
    private button mbutlogin;
    private loginmodelimpl mloginmodel;
    private progressdialog mprogressdialog;

    @override
    protected void oncreate(bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        setcontentview(r.layout.activity_main);

        metname = findviewbyid(r.id.et_user_name);
        metpassword = findviewbyid(r.id.et_password);
        mbutlogin = findviewbyid(r.id.but_login);
        mloginmodel=new loginmodelimpl();
        mbutlogin.setonclicklistener(new view.onclicklistener() {
            @override
            public void onclick(view v) {
                //登录
                string username = metname.gettext().tostring();
                string pwd = metpassword.gettext().tostring();
                mloginmodel.getuserinfo(username,pwd,mainactivity.this);
            }
        });

    }

    @override
    public void onstart_() {
        log.d(tag, "onstart_: ");
        mprogressdialog=new progressdialog(this);
        mprogressdialog.settitle("请求中……");
        mprogressdialog.show();
    }

    @override
    public void onsuccess(userinfo userinfo) {
        log.d(tag, "onsuccess: ");
        mprogressdialog.dismiss();
        toast.maketext(this,"登录成功",toast.length_short).show();
    }


    @override
    public void onfailed() {
        log.d(tag, "onfailed: ");
        toast.maketext(this,"登录失败",toast.length_short).show();
    }

    @override
    public void onfinish() {
        log.d(tag, "onfinish: ");
        mprogressdialog.dismiss();
    }

    private static final string tag = "mainactivity";
}

上面例子是mvc的简单运用,当你点击登录就是获取登录数据,通过modle层中的接口实现类(loginmodelimpl)来获取网络数据,并把数据返回view层显示交互,从上面例子可以看出,controller控制器activity一定程度上实现了视图ui层与数据modle层的解耦,将view层和modle
层进行了分离,但并不是十分完美,就是在controller层activity中同时存在布局视图初始化和业务逻辑操作响应,也就是view层初始化和controller层同时绑定到同一类中。当业务越来越复杂时,activity的职责会越来越多,代码会越来越浮肿,不利于后期的维护。