MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
MVC简介
MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来展示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
MVC编程模式
Model(模型)表示应用程序核心(比如数据库记录列表)。
View(视图)显示数据(数据库记录)。
Controller(控制器)处理输入(写入数据库记录)。
MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。
MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。
框架和设计模式的区别
框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。框架通常是代码重用,而设计模式是设计重用,架构则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。在软件生产中有三种级别的重用:内部重用,即在同一应用中能公共使用的抽象块;代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用;应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。
框架与设计模式虽然相似,但却有着根本的不同。设计模式是对在某种环境中反复出现的问题以及解决该问题的方案的描述,它比框架更抽象;框架可以用代码表示,也能直接执行或复用,而对模式而言只有实例才能用代码表示;设计模式是比框架更小的元素,一个框架中往往含有一个或多个设计模式,框架总是针对某一特定应用领域,但同一模式却可适用于各种应用。可以说,框架是软件,而设计模式是软件的知识。
优点
耦合性低
耦合性(Coupling)耦合性也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块之间越独立则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。
将视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
重用性高
随着技术的不断进步,需要用越来越多的方式来访问应用程序。MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。
生命周期成本低
MVC使开发和维护用户接口的机数含量降低。
可维护性高
分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。
1.我们说了我们要把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);
}
3.就是我们的逻辑处理NewsModelImpl进行网络请求
public class NewsModelImpl implements NewsModel {
private final String baseUrl = "http://v.juhe.cn";
private final String key = "这个地方就写你在聚合数据上面申请的今日头条的KEY";
@Override
public 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>() {
@Override
public 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();
}
}
@Override
public void onFailure(Call<News> call, Throwable t) {
t.getStackTrace();
mlistener.onError();
}
});
}
}
4.MainActivity.java
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;
@Override
protected 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());
}
@Override
public 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;
}
}
@Override
public void onSuccess(News news) {
setView(news);
}
@Override
public void onError() {
Toast.makeText(this, "出错了哦!", Toast.LENGTH_SHORT).show();
}
}