Day2:MVC模式

MVC设计模式

一.MVC的介绍

在这里插入图片描述
MVC是Model-View-Controller的简称

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

二.MVC模式的优点

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

三.如何实现MVC模式

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

1.OnNewsListener.java

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

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

2.NewsModel.java

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

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

3.NewsModelImpl.java

就是我们的逻辑处理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();
    }
}

这样就大功告成了!

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

练习手册

题目一:使用MVC完成下面功能

①按钮1:上传mp3文件到服务器中,上传过程中显示进度条
②按钮2: 将上传的MP3文件下载到SD卡中,下载过程中显示进度条
③下载音乐完成后使用MediaPlayer播放音乐
④按钮3: 上传图片到服务器中,上传过程中显示进度条
⑤按钮4: 将上传的图片下载到SD卡中,下载完成显示在ImageView中
⑥按钮5:下载下面视频到SD卡中,显示进度条并支持断点下载
http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4

题目二:使用MVC完成建材网首页功能

1.项目采用MVC模式
2.实现搜索框布局,UI100%还原
3.使用http post请求网络请求轮播图接口,UI100%还原
4.使用http post请求中间菜单数据,UI100%还原
5.使用http post请求完成产品分类,UI100%还原
6.首页可以实现上下滑动
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值