1. 架构设计-MVC

2021-12-31  本文已影响0人  彩虹_直至黑白

前言

Android开发已经日趋成熟, 以前一直困扰的项目架构问题, 也随着社区的不断努力, 从MVC中受到启发, 陆续推出MVP, MVVM等架构模型,从而创建适合Android的开发框架。未使用架构的项目:

  1. 未分离界面(UI)逻辑与业务(Business)逻辑;
  2. 版本迭代导致所有相关类, 不断需要修改;
  3. 模块高耦合低内聚, 存在隐藏Bug, 无法编码测试;

使用架构的目标就是为了解决这些问题。所有架构都来源于早期的MVC,即Model-View-Controller模型, 本文由近及远分析MVC,MVP,MVVM三类主流架构模式, 并解释其中的优缺点。

MVC概念

MVC,即Model-View-Controller,将业务逻辑、数据、界面分离的一种代码组织方式,修改界面时无需去修改业务逻辑。

MVC架构
  1. View接受用户的请求,然后将请求传递给Controller。
  2. Controller进行业务逻辑处理后,通知Model去更新。
  3. Model数据更新后,通知View去更新界面显示。
简单示例

Android中一般布局的XML文件就是View层,Activity则充当了Controller的角色。下面举个简单的例子来实现,点击按钮对数字+1然后重新显示出来。

Model层

创建一个数据模型,能够保存一个数字,并有一个更新的方法,数据更新完后会通知UI去更改显示的内容。


public class NumModel {
    private int num = 0;

    public void add(ControllerActivity activity) {
        num = ++num;//更新数据
        activity.updateUI(num + "");//更新UI
    }

}

View层

View层在Android中对应的就是布局的XML文件。


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <TextView
        android:id="@+id/tv_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"/>

    <Button
        android:id="@+id/btn_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击+1"/>
</LinearLayout>

Controller层

Android中一般由Activity来充当Controller。Controller一方面接收来自View的事件,一方面通知Model处理数据。

public class ControllerActivity extends Activity {

    private TextView mTextView;
    private Button mButton;
    private NumModel mNumModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_controller);

        mTextView = findViewById(R.id.tv_show);
        mButton = findViewById(R.id.btn_add);
        mNumModel = new NumModel();
        
        mButton.setOnClickListener(new View.OnClickListener() {//接收来自View的事件
            @Override
            public void onClick(View v) {
                mNumModel.add(ControllerActivity.this);//通知Model处理数据
            }
        });
    }

    public void updateUI(String text) {//更新UI
        mTextView.setText(text);
    }
}
总结

优点

  1. 视图层(View)与模型层(Model)解偶,通过Controller来进行联系。
  2. 模块职责划分明确。主要划分层M,V,C三个模块,利于代码的维护。

缺点

  1. Android中使用了Activity来充当Controller,但实际上一些UI也是由Activity来控制的,比如进度条等。因此部分视图就会跟Controller捆绑在同一个类了。同时,由于Activity的职责过大,Activity类的代码也会迅速膨胀。
  2. MVC还有一个重要的缺陷就是View跟Model是有交互的,没有做到完全的分离,这就会产生耦合。
上一篇下一篇

猜你喜欢

热点阅读