前言

已经有几天没有写过帖子了,主要前一段时间在忙公司的项目,现在闲下来想看一下其他的东西,然后从公司的iOS大神那里了解到了苹果的设计模式是MVC,于是想着自己也来写一下Android这边的MVC。然后这里我就不多扯皮了,Mhahahahha…

名言
对于攀登者来说,失掉往昔的足迹并不可惜,迷失了继续前时的方向却很危险。


MVC的介绍

MVC是Model-View-Controller的简称

Model:模型层,负责处理数据的加载或者存储
View:视图层,负责界面数据的展示,与用户进行交互
Controller:控制器层,负责逻辑业务的处理

那我们为什么要用到MVC模式呢?

1、耦合性低。降低了代码的耦合性,利用MVC框架使得View(视图)层和Model(模型)层可以很好的分离,这样就达到了解耦的目的,所以耦合性低,减少模块代码之间的相互影响。
2、模块区域分明,方便开发人员的维护。

接下来我们就看一个例子,从例子中来理解MVC设计模式


老规矩我们先来看看例子的效果图。

先来解释一下这个例子,我这个例子是请求网络获取新闻头条的一下标题等内容(接口我是在聚合数据上面找的免费的),然后代码中我会体现出怎么把Model和view和Controller分离开来。


首先来看看整体的项目架构。

然后来解释一下
News—>新闻的实体类
MyService—>我这里请求网络用的是Retrofit,所以这里有个请求的接口
NewsModel—>这个接口是C层和M层用来交互的
NewsModelImpl—>这个是用来Model层用来进行请求网络的处理
OnNewsListener—>这个是Model逻辑处理完成后通知View层进行改变的


第一步:首先我们来看看xml。很简单的一个布局一个输入一个按钮,几个textview

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><EditText
        android:id="@+id/edit"android:layout_width="match_parent"android:layout_height="50dp"android:layout_margin="16dp"android:hint="请输入新闻种类" /><Button
        android:id="@+id/button"android:layout_width="match_parent"android:layout_height="50dp"android:layout_marginLeft="16dp"android:layout_marginRight="16dp"android:text="查询" /><TextView
        android:id="@+id/title"android:layout_width="match_parent"android:layout_height="44dp"android:layout_marginLeft="16dp"android:layout_marginRight="16dp"android:layout_marginTop="5dp"android:gravity="center"android:textSize="16sp" /><TextView
        android:id="@+id/date"android:layout_width="match_parent"android:layout_height="44dp"android:layout_marginLeft="16dp"android:layout_marginRight="16dp"android:layout_marginTop="5dp"android:gravity="center"android:textSize="16sp" /><TextView
        android:id="@+id/category"android:layout_width="match_parent"android:layout_height="44dp"android:layout_marginLeft="16dp"android:layout_marginRight="16dp"android:layout_marginTop="5dp"android:gravity="center"android:textSize="16sp" /><TextView
        android:id="@+id/author_name"android:layout_width="match_parent"android:layout_height="44dp"android:layout_marginLeft="16dp"android:layout_marginRight="16dp"android:layout_marginTop="5dp"android:gravity="center"android:textSize="16sp" /></LinearLayout>

第二步:我们说了我们要把model和view分开,但是需要联系,model处理完成了以后需要告诉view层我做完了请你展示。所以他们直接是要用联系的那就是OnNewsListener

public interface OnNewsListener {void onSuccess(News news);void onError();
}

这个接口里面只给了见单的2个操作成功失败。


第三步: 我们知道用户通过Controller告诉model应该干什么说以,他们之间的联系就是NewsModel

public interface NewsModel {void getWeather(String name, OnNewsListener mlistener);
}

第四步: 就是我们的逻辑处理NewsModelImpl进行网络请求

public class NewsModelImpl implements NewsModel {private final String baseUrl = "http://v.juhe.cn";private final String key = "这个地方就写你在聚合数据上面申请的今日头条的KEY";@Overridepublic void getWeather(String name, final OnNewsListener mlistener) {OkHttpClient.Builder client = new OkHttpClient.Builder();Retrofit retrofit = new Retrofit.Builder().client(client.build()).baseUrl(baseUrl).addConverterFactory(GsonConverterFactory.create()).build();MyService service = retrofit.create(MyService.class);service.getNews(key,name).enqueue(new Callback<News>() {@Overridepublic void onResponse(Call<News> call, Response<News> response) {News news = response.body();if (news.getReason().equals("成功的返回")) {Log.e("news", "成功");mlistener.onSuccess(news);} else {Log.e("news", "失败");mlistener.onError();}}@Overridepublic void onFailure(Call<News> call, Throwable t) {t.getStackTrace();mlistener.onError();}});}
}

请求成功我们就通过OnNewsListener告诉view可以开始变了


第五步: 我们看看MainActivity

public class MainActivity extends AppCompatActivity implements OnNewsListener, View.OnClickListener {private EditText editText = null;private Button button = null;private TextView title, date, category, author_name = null;private NewsModelImpl weatherModel = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);weatherModel = new NewsModelImpl();initView();}public void initView() {editText = (EditText) findViewById(R.id.edit);button = (Button) findViewById(R.id.button);title = (TextView) findViewById(R.id.title);date = (TextView) findViewById(R.id.date);category = (TextView) findViewById(R.id.category);author_name = (TextView) findViewById(R.id.author_name);button.setOnClickListener(this);}//设置数据public void setView(News news) {title.setText(news.getResult().getData().get(1).getTitle());date.setText(news.getResult().getData().get(1).getDate());category.setText(news.getResult().getData().get(1).getCategory());author_name.setText(news.getResult().getData().get(1).getAuthor_name());}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.button:String name = editText.getText().toString();if (!name.equals("")) {weatherModel.getWeather(name, this);} else {Toast.makeText(this, "输入的新闻标题不能为空", Toast.LENGTH_SHORT).show();}break;}}@Overridepublic void onSuccess(News news) {setView(news);}@Overridepublic void onError() {Toast.makeText(this, "出错了哦!", Toast.LENGTH_SHORT).show();}
}

这样就大功告成了!

然后看到这突然发现activity不仅仅座位了view层,还作为了Controller,其实做过电商类的都应该知道按照道理来说我们这个地方应该把Controller单独的提出来写,因为在Android中如果用xml作为view层的话,显得就有些苍白无力,所以activity作为了view层。但在iOS中就不会存在这个问题,所以我个人觉得MVP的模式更加适合Android。

写的有不好的地方~~~~请多指正。

Android 设计模式之MVC,从一个实例中来理解MVC相关推荐

  1. MVC简单实现插件Demo-从底层理解MVC路由匹配浏览器请求的URL

    今天实现了在mvc平台下自定义插件,虽然功能比较简单,但是通过对反射的运用,更加明白了为什么我们在浏览器上输入友好的url时,mvc会智能的帮我们找到我们想要查找的页面呢?mvc在底层又是怎样实现的呢 ...

  2. 从一个实例中学习DTW算法

     基于动态时间规整算法(DTW)的相似度计算 Killer 发表于(2015-10-063) 本文标签:大数据 机器学习 算法 浏览量:193次 喜欢收藏 在孤立词语音识别中,最为简单有效的方法是 ...

  3. HMM学习笔记_1(从一个实例中学习DTW算法)

    DTW为(Dynamic Time Warping,动态时间归准)的简称.应用很广,主要是在模板匹配中,比如说用在孤立词语音识别,计算机视觉中的行为识别,信息检索等中.可能大家学过这些类似的课程都看到 ...

  4. android 多个fragment切换,一个Activity中多个Fragment的切换

    经常会遇到在一个activity界面上布局多个fragment,但是如何从一个fragment跳转到另一个fragment呢?今天在做项目中恰好遇到这样的问题,点击首页fragment的更多店铺,会切 ...

  5. Spring MVC(10):REST 支持 Ajax+Spring MVC 实例

    Spring 对于 REST 的支持 REST REST(Respresentational State Transfer) 是一种面向资源,强调描述应用程序远程调用的开发方式,并不特指某种技术和框架 ...

  6. 谈谈我对MVC的View层实现的理解

    谈谈我对MVC的View层实现的理解 MVC框架可以把应用清晰明了地分为三个部分:Model层–数据层,View层–视图层,Controller–逻辑层,Model层负责整合数据,View层负责页面渲 ...

  7. android 之自定义适配器(重写的getView()方法中convertView元素的妙用)一个实例

    实现效果: 主要还是ListView的优化: 基本思路: <1>使用自定义适配器完成操作 <2>将listView进行优化处理 /*  //ListView完成了重用条目的优化 ...

  8. controller调用另一个controller中的方法 获取返回值_必须掌握!你知道 Spring 中运用的 9 种设计模式吗 ?...

    Spring中涉及的设计模式总结,在面试中也会经常问道 Spring 中设计模式的问题.本文以实现方式.实质.实现原理的结构简单介绍 Sping 中应用的 9 种设计模型,具体详细的刨析会在后面的文章 ...

  9. Android开发模式万佛朝中MVX(MVC、MVP、MVVM)

    今天公司的测试服务器开小差了,后台被吐槽的体无完肤,虽然我们都知道跟他没有什么关系,但是生活需要乐趣,总要有人背锅,哈哈!~~~暂时没有环境开发了,那就分享一下之前做的一篇关于Android开发模式的 ...

最新文章

  1. datagridvie设置行高列宽_DataGridView使用技巧(七、设定列宽和行高自动调整)----.NET...
  2. 4.4 为什么使用深层表示-深度学习-Stanford吴恩达教授
  3. github遇到问题Updates were rejected because the remote contains work that you do hint: not have locally.
  4. java中将对象转为基本数据类型
  5. ubuntu如何编辑/etc/ld.so.conf
  6. linux软链接的创建、删除和更新
  7. java面试题三 位运算符
  8. SAP 电商云 Spartacus UI SSR 单元测试里的 callFake
  9. Oracle入门(十四A)之PL/SQL 基本结构
  10. 计算机辅助应用的缩写有什么,计算机辅助设计的英文缩写是什么
  11. SpringBoot—启动报错Exception in thread “main“ java.lang.ClassNotFoundException
  12. Zabbix探索:无法获取Windows主机CPU利用率、负载等问题处理
  13. struts2上传多文件(b)
  14. (APIO2014)序列分割
  15. android常用的混淆规则,关于Android混淆的基本做法
  16. 华为网络设备交换机路由器查看MAC地址表项命令方法
  17. 解决ROS中运行launch文件报错ERROR: cannot launch node of type[xxx/xxx]:xxx的问题
  18. 纠正英语语法错误---Grammarly安装
  19. 已经更CSS《一篇文章让你从HTML零基础入门前端开发》12.22
  20. Eason Chan

热门文章

  1. Android ListView下拉刷新
  2. C语言之strtok函数
  3. jbpm创建流程图_jbpm - 工作流的基本操作
  4. 计算机小学数学辅助教学缺点及对策 论文,小学数学第二学段图形与几何领域的作业设计研究...
  5. 百度JAVA一二三面面经(2019秋招深圳)
  6. RocketMQ-broker启动流程详解
  7. shell常用语法之if [ $? -ne 0 ]
  8. 协方差矩阵和相关矩阵的关系
  9. PTA 天梯赛的善良(20分)[C语言]
  10. SQL Server Management Studio (SSMS)