设计模式——MVC

来源:互联网 发布:局域网视频通话软件 编辑:程序博客网 时间:2024/06/06 14:43

这里写图片描述

MVC各层介绍

M层:对应实体模型和业务逻辑,比如数据库存取操作,网络操作,复杂的算法,耗时的任务都放在model层处理。
V层:对应于布局文件,将model层的数据呈现给用户。
C层:对应于Activity,处理用户交互问题,读取V层的数据,控制用户输入,向Model发送数据请求。

用户登录示例

效果图

这里写图片描述 这里写图片描述

项目目录如图

这里写图片描述

View层

View层的布局文件

<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:gravity="center"    android:orientation="vertical" >    <EditText        android:id="@+id/et_name"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="用户名" />    <EditText        android:id="@+id/et_passwd"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="密码"        android:password="true" />    <Button        android:id="@+id/bt_login"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="登录" /></LinearLayout>

model层

model中的实体类UserEntity

package com.a.mvcdemo.model.entity;import java.io.Serializable;//MVC中的实体类public class UserEntity implements Serializable{    private String userName;    private String passwd;    public UserEntity(String userName, String passwd) {        super();        this.userName = userName;        this.passwd = passwd;    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getPasswd() {        return passwd;    }    public void setPasswd(String passwd) {        this.passwd = passwd;    }}

model层的业务逻辑,这个示例中需要登录的业务逻辑。先定义一个接口:ILoginModel

package com.a.mvcdemo.model;import com.a.mvcdemo.listener.OnLoginListener;import com.a.mvcdemo.model.entity.UserEntity;//MVC中的业务逻辑public interface ILoginModel {    /**     * 登录     * @param user 用户bean     * @param listener 登录回调监听接口     */    void Login(UserEntity user,OnLoginListener listener);}

登录成功与否需要一个监听回调接口:OnLoginListener

package com.a.mvcdemo.listener;import com.a.mvcdemo.model.entity.UserEntity;public interface OnLoginListener {    /**     * 登录成功     * @param user     */    void onSuccess(UserEntity user);    /**     * 登录失败     */    void onFailed();}

ILoginModel接口的实现类:LoginModelImpl

package com.a.mvcdemo.model;import android.os.Handler;import com.a.mvcdemo.listener.OnLoginListener;import com.a.mvcdemo.model.entity.UserEntity;public class LoginModelImpl implements ILoginModel {    private Handler myHandler = new Handler();    @Override    public void Login(final UserEntity user, final OnLoginListener listener) {        new Thread() {            public void run() {                try {                    Thread.sleep(2000);                } catch (InterruptedException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                //本地模拟验证                if (user.getUserName().equals("user")                        && user.getPasswd().equals("123")) {                    myHandler.post(new Runnable() {                        @Override                        public void run() {                            listener.onSuccess(user);                        }                    });                } else {                    myHandler.post(new Runnable() {                        @Override                        public void run() {                            listener.onFailed();                        }                    });                }            };        }.start();    }}

Controller层

LoginActivity,用户登录后需要通过Controller控制登录成功与否后的操作,所以LoginActivity要实现接口:OnLoginListener 。

package com.a.mvcdemo.view.activity;import com.a.mvcdemo.R;import com.a.mvcdemo.listener.OnLoginListener;import com.a.mvcdemo.model.ILoginModel;import com.a.mvcdemo.model.LoginModelImpl;import com.a.mvcdemo.model.entity.UserEntity;import android.support.v7.app.ActionBarActivity;import android.app.ProgressDialog;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;//MVC中的Controllerpublic class LoginActivity extends ActionBarActivity implements OnClickListener,        OnLoginListener {    private EditText et_name, et_passwd;    private Button bt_login;    private ILoginModel loginModel;    private ProgressDialog progressDialog;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initViews();// 初始化view        initDatas();// 初始化数据        initEvents();// 初始化事件    }    private void initDatas() {        loginModel = new LoginModelImpl();        progressDialog = new ProgressDialog(this);        progressDialog.setTitle("加载中。。。");    }    private void initEvents() {        bt_login.setOnClickListener(this);    }    private void initViews() {        et_name = (EditText) findViewById(R.id.et_name);        et_passwd = (EditText) findViewById(R.id.et_passwd);        bt_login = (Button) findViewById(R.id.bt_login);    }    @Override    public void onClick(View v) {        switch (v.getId()) {        case R.id.bt_login:            UserEntity user = new UserEntity(et_name.getText().toString().trim(), et_passwd                    .getText().toString().trim());            showLoadingDialog();            loginModel.Login(user, this);            break;        }    }    // 登录成功时回调    @Override    public void onSuccess(UserEntity user) {        dismissLoadingDialog();        Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();    }    // 登录失败时回调    @Override    public void onFailed() {        dismissLoadingDialog();        Toast.makeText(LoginActivity.this, "登录失败", Toast.LENGTH_SHORT).show();    }    // 显示加载对话框    private void showLoadingDialog() {        progressDialog.show();    }    // 取消加载对话框    private void dismissLoadingDialog() {        progressDialog.dismiss();    }}