王学岗app设计框架:mvc框架

来源:互联网 发布:windows arp命令事例 编辑:程序博客网 时间:2024/06/05 02:30

本文目的:对app设计架构有一个初步的了解;
**为什么需要架构设计(代码在10万行以上)
1,使我们的程序模块化(分工协同开发的需要),模块内部的高内聚和模块之间的低耦合;
2,提高开发效率,后期的测试以及定位会变得更容易
**android中MVC设计架构
1,android中的设计架构都是来源于javaweb当中一些思想和模式
2,android中界面部分就是采用当前比较流行的MVC架构!
V:视图层
 进行数据的展示;xml文件,可以理解为app中的View;
C:控制层:contorller
android中的控制层就是Activity;在改层可以绑定数据,获取控件,业务逻辑;android中的activity的相应时间是5秒;如果耗时操作放在这里程序就容易被回收掉
M:模型层model
主要是针对业务模型;建立数据结构和相关的类;与View无关但与业务有关
对数据库的操作,对网络的操作都应该放在model层。android中的mvc注重的是model的复用!
下面写一个例子,我们看看MVC的优缺点
我们先看下包和类的结构这里写图片描述
我们看下视图层:
视图层比较简单,只有一个按钮和三个TextView

<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:orientation="vertical"    tools:context=".MainActivity" >    <Button        android:id="@+id/get_user"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="得到用户信息" />    <TextView        android:id="@+id/tv_name"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/tv_age"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/tv_sex"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></LinearLayout>

在看下Controller层,就是我们的MainActivity

package com.controller.gang;import android.app.Activity;import android.app.ProgressDialog;import android.os.Bundle;import android.os.Handler;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;import com.example.jiagou.R;import com.model.gang.IGetUser;import com.model.gang.OnUserInfoListenner;import com.model.gang.User;import com.model.gang.impl.GetUserInfoImp;//Activity(控制层)需要做的事情//1,获取控件//2,处理事件//3,获取数据//4,控件绑定数据public class MainActivity extends Activity {    private IGetUser mIGetUser;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 获取控件        setContentView(R.layout.activity_main);        tv_name = (TextView) findViewById(R.id.tv_name);        tv_age = (TextView) findViewById(R.id.tv_age);        tv_sex = (TextView) findViewById(R.id.tv_sex);        btn = (Button) findViewById(R.id.get_user);        // 获取数据        mIGetUser = new GetUserInfoImp();        // 获取数据是耗时操作,使用进度条        ProgressDialog pd = new ProgressDialog(this);        pd.setMessage("正在加载");        btn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                getUserInfoImp(1);            }        });    }    protected void getUserInfoImp(int i) {        // 将数据与控件进行绑定        // 获取数据要从model层拿        // 该方法为耗时操作,不能直接赋值        mIGetUser.getUserInfo(i, new OnUserInfoListenner() {            @Override            public void getUusrInfoSuccess(final User user) {                mHandler.post(new Runnable() {                    @Override                    public void run() {                        tv_name.setText(user.getName());                        tv_sex.setText(user.getSex());                        tv_age.setText(String.valueOf(user.getAge()));                    }                });            }            @Override            public void getUusrInfoFail() {                mHandler.post(new Runnable() {                    @Override                    public void run() {                        // TODO Auto-generated method stub                        Toast.makeText(MainActivity.this, "获取信息失败", Toast.LENGTH_SHORT).show();                    }                });            }        });    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }    private Handler mHandler = new Handler();    private TextView tv_name;    private TextView tv_age;    private TextView tv_sex;    private Button btn;}

Model层类比较多,一个类一个类的贴

package com.model.gang;//获取数据的接口 ,方便获取数据public interface IGetUser {    void getUserInfo(int id,OnUserInfoListenner listenner);}
package com.model.gang;//public interface OnUserInfoListenner {//回调方法    void getUusrInfoSuccess(User user);    void getUusrInfoFail();}
package com.model.gang;public class User {    private String name;    private String sex;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }private int id;    public int getId() {    return id;}public void setId(int id) {    this.id = id;}    private int age;}
package com.model.gang.impl;import com.model.gang.IGetUser;import com.model.gang.OnUserInfoListenner;import com.model.gang.User;//获取数据,获取数据是在model层// 可以在网络,数据库,服务器,文件等获取数据public class GetUserInfoImp implements IGetUser {    @Override    public void getUserInfo(final int id, final OnUserInfoListenner listenner) {        // 模拟子线程耗时操作        new Thread() {            public void run() {                try {                    Thread.sleep(2000);                } catch (InterruptedException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                if (id == 1) {                    User user = new User();                    user.setName("葛柳君");                    user.setAge(18);                    user.setSex("动物");                    // 谁实现了该监听谁就得到了这个数据                    listenner.getUusrInfoSuccess(user);                } else {                    listenner.getUusrInfoFail();                }            }        }.start();    }}

以上就是我们的mvc架构;但这个架构也有缺点;在Activity中既要进行获取控件,又要获取数据,还要绑定数据,还要处理事件;Activity承担了太多的逻辑,违背了面向对象的单一职能原则;

0 0