MVC框架模式在Android中的应用
一.引言
在Android中,不论是实际开发,还是在android面试中,MVC无时无刻都存在我们的身边,由此可见MVC的重要性,所以,我将分模块来对MVC框架做一个完整的剖析,全面认识MVC,能够在项目开发中非常熟练的引用。二.MVC的基本概念
MVC的全名是: Model View Controller,是模型(Model)-视图(View)-控制器(Controller)的简写,它是一种代码设计典范,通过业务逻辑,数据,视图分离的方式来组织代码的编写,通过MVC,我们可以将不同的操作分离出来,各模块各司其职,专门处理其对应的工作,使得代码达到易维护,重复使用,耦合低等效果。三.MVC中三个模块的简单描述
(1)模型(Model): 一些业务逻辑可以放在该层来进行处理,比如网络请求数据,对数据库的增删改查的处理,总之,一系列涉及到业务逻辑处理和一些耗时的操作,都可以分离出来,放在Model层来操作;
(2)视图(View): 在android中,该层主要是指xml的布局文件,用来显示界面数据,直接与用户进行交互;
(3)控件器(Controller):充当桥梁的作用,用于协调模型(Model)和视图(View)的处理,控制数据的展示。四.商品列表案例概叙MVC
这里为了简单起见,数据在本地随机生成,没有从服务器获取,因为主要重点不是网络交互。
首先,看效果图:
![这里写图片描述](https://img-blog.csdn.net/20160128110153999)
activity:
package mzbemployeeapp.wellke.com.mvcdemo;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
import mzbemployeeapp.wellke.com.mvcdemo.activitys.BaseActivity;
import mzbemployeeapp.wellke.com.mvcdemo.entity.Shop;
import mzbemployeeapp.wellke.com.mvcdemo.interfaces.GetData;
import mzbemployeeapp.wellke.com.mvcdemo.listener.GetDataListener;
import mzbemployeeapp.wellke.com.mvcdemo.model.GetDataImplement;
public class MainActivity extends BaseActivity implements GetDataListener {@InjectView(R.id.shop_name)
TextView shopName;
@InjectView(R.id.shop_desc)
TextView shopDesc;
@InjectView(R.id.shop_price)
TextView shopPrice;
GetData getData;
@InjectView(R.id.shop_image)
ImageView shopImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
init();
}private void init() {
getData = https://www.it610.com/article/new GetDataImplement();
}@OnClick(R.id.btn)
public void onClick() {
getData.getShopsData(this);
}@Override
public void onGetDataSuccess(Shop shop) {
showData(shop);
}@Override
public void onGetDataError(String errmessage) {}//控制视图(View)层数据显示的方法
private void showData(Shop shop) {
shopImage.setImageResource(shop.getImage());
shopName.setText(shop.getName());
shopPrice.setText(String.valueOf(shop.getPrice()));
shopDesc.setText(shop.getDesc());
}}
package mzbemployeeapp.wellke.com.mvcdemo.listener;
import mzbemployeeapp.wellke.com.mvcdemo.entity.Shop;
/**
* Created by wellke on 2016/1/28.
*/
public interface GetDataListener {
void onGetDataSuccess(Shop shop);
void onGetDataError(String errmessage);
}
package mzbemployeeapp.wellke.com.mvcdemo.interfaces;
import mzbemployeeapp.wellke.com.mvcdemo.listener.GetDataListener;
/**
* Created by wellke on 2016/1/28.
*/
public interface GetData {
void getShopsData(GetDataListener getDataListener);
}
package mzbemployeeapp.wellke.com.mvcdemo.entity;
/**
* Created by wellke on 2016/1/28.
*/
public class Shop {
String name;
int image;
String desc;
float price;
public Shop() {}public Shop(String name, int image, float price, String desc) {
this.name = name;
this.image = image;
this.price = price;
this.desc = desc;
}public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public int getImage() {
return image;
}public void setImage(int image) {
this.image = image;
}public String getDesc() {
return desc;
}public void setDesc(String desc) {
this.desc = desc;
}public float getPrice() {
return price;
}public void setPrice(float price) {
this.price = price;
}
}
package mzbemployeeapp.wellke.com.mvcdemo.model;
import java.util.Random;
import mzbemployeeapp.wellke.com.mvcdemo.R;
import mzbemployeeapp.wellke.com.mvcdemo.entity.Shop;
import mzbemployeeapp.wellke.com.mvcdemo.interfaces.GetData;
import mzbemployeeapp.wellke.com.mvcdemo.listener.GetDataListener;
/**
* Created by wellke on 2016/1/28.
*/
public class GetDataImplement implements GetData {//这里在实际开发中应该是网络请求数据,这里为了方便直接在本地生成
@Override
public void getShopsData(GetDataListener getDataListener) {
//随机生成一组数据
Shop shop=new Shop("韩版潮流裙子", R.mipmap.skirt_15,new Random().nextFloat()+200.0f,"小麦色的皮肤给人一种健康活力的感觉," +
"穿着耐克的一整套的纯白带粉色边运动服,微卷的褐色头发扎成一个轻松活泼的辫子,总是那自信可爱的表情 浓密金" +
"色的大波浪长发随意地披在肩头," + "丝丝缕缕都热辣得迷死人~!浓密的睫毛、魅惑的眼神、性感丰厚的双唇,");
if (shop != null){
getDataListener.onGetDataSuccess(shop);
}
else {
getDataListener.onGetDataError("数据请求失败");
}}
}
【MVC框架模式在Android中的应用】五.实例简述
这个实例其实非常简单,就是当你点击按钮的时候获取数据,并对其进行了展示,但是他运用MVC框架模式,使得程序代码健壮性提升了几个档次,这里activity充当控制器(Controller)的角色,用于控制数据的展示,布局文件则是视图层,用于直接展示数据,与用户进行交互,GetDataImplement是模型(Model)层,用于获取数据,在activity中,实现了GetDataListener,当点击按钮时,调用GetDataImplement中的getShopsData方法,获取商品数据,在getShopsData方法中,当数据获取获取成功后就调用GetDataListener的onGetDataSuccess方法,否则调用onGetDataError方法,然后再activity实现GetDataListener接口时,会实现onGetDataSuccess和onGetDataError这两个方法。
六.总结
通过MVC,可以大大的简化代码的编写,首先,降低了代码间的耦合性,不会由于修改了某一个地方,而导致其他模块也发生了变化,然后,代码也更易于维护,比如,在另一个界面,我们要从服务器获取数据,我们只需要另外写一个类,去实现GetData接口即可,不用再activity中做大量的修改,这样当我们在添加需求和修改需求时,可以大大降低因修改代码而造成bug出现的情况。
推荐阅读
- android第三方框架(五)ButterKnife
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- 设计模式-代理模式-Proxy
- Spring|Spring 框架之 AOP 原理剖析已经出炉!!!预定的童鞋可以识别下发二维码去看了
- 【译】Rails|【译】Rails 5.0正式发布(Action Cable,API模式等)
- java静态代理模式
- VueX(Vuex|VueX(Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式)
- 构建App(一)(框架与结构)
- Kotlin基础(10)-代理模式在kotlin中的使用