Android开发中的MVC_MVP_MVVM

177 阅读3分钟

需求(查询用户账号信息):

用户输入账号,点击按钮可进行查询账号信息,如果查询成功,则将数据展示在界面上;若果查询数据失败,则在界面上提示获取数据失败。

 

界面如下:


不适用框架实现需求

NormalActivity

  • 获取用于输入的信息

  • 展示获取信息成功界面

  • 展示获取信息失败界面

  • 查询用户数据

  • 业务逻辑

  结构图如下:

1.//账号信息  
2.public class Account {  
3.    private String name;//账号名称  
4.    private int level;//账号等级  
5.  
6.    public String getName() {  
7.        return name;  
8.    }  
9.  
10.    public void setName(String name) {  
11.        this.name = name;  
12.    }  
13.  
14.    public int getLevel() {  
15.        return level;  
16.    }  
17.  
18.    public void setLevel(int level) {  
19.        this.level = level;  
20.    }  
21.}  

1.public interface MCallBack {  
2.    void onSuccess(Account account);  
3.  
4.    void onFailed();  
5.}  
1.public class NormalActivity extends AppCompatActivity implements View.OnClickListener {  
2.    //展示查询结果  
3.    private TextView mTvResult;  
4.    //用户输入信息的输入框  
5.    private EditText mEtAccount;  
6.  
7.    @Override  
8.    protected void onCreate(@Nullable Bundle savedInstanceState) {  
9.        super.onCreate(savedInstanceState);  
10.        setContentView(R.layout.activity_normal);  
11.        initView();  
12.    }  
13.  
14.    //初始化View  
15.    private void initView() {  
16.        mTvResult = findViewById(R.id.tv_result);  
17.        mEtAccount = findViewById(R.id.et_account);  
18.        findViewById(R.id.btn_getAccount).setOnClickListener(this);  
19.    }  
20.  
21.    @Override  
22.    public void onClick(View v) {  
23.        getAccountData(getUserInput(), new MCallBack() {  
24.            @Override  
25.            public void onSuccess(Account account) {  
26.                showSuccessPage(account);  
27.            }  
28.  
29.            @Override  
30.            public void onFailed() {  
31.                showFailedPage();  
32.            }  
33.        });  
34.    }  
35.  
36.    //获取用户输入信息  
37.    private String getUserInput() {  
38.        return mEtAccount.getText().toString();  
39.    }  
40.  
41.    //展示获取数据成功的界面  
42.    private void showSuccessPage(Account account) {  
43.        mTvResult.setText("用户账号:" + account.getName() + "|"  
44.                + "用户等级:" + account.getLevel());  
45.    }  
46.  
47.    //展示获取数据失败的界面  
48.    private void showFailedPage() {  
49.        mTvResult.setText("获取数据失败");  
50.    }  
51.  
52.    //模拟查询账号数据  
53.    private void getAccountData(String accountName, MCallBack callBack) {  
54.        Random random = new Random();  
55.        boolean isSuccess = random.nextBoolean();  
56.        if (isSuccess) {  
57.            Account account = new Account();  
58.            account.setName(accountName);  
59.            account.setLevel(100);  
60.            callBack.onSuccess(account);  
61.        } else {  
62.            callBack.onFailed();  
63.        }  
64.    }  
}  
1.public class MainActivity extends AppCompatActivity {  
2.    @Override  
3.    protected void onCreate(Bundle savedInstanceState) {  
4.        super.onCreate(savedInstanceState);  
5.        setContentView(R.layout.activity_main);  
6.        findViewById(R.id.btn_start).setOnClickListener(new View.OnClickListener() {  
7.            @Override  
8.            public void onClick(View v) {  
9.                Intent intent = new Intent(MainActivity.this, NormalActivity.class);  
10.                startActivity(intent);  
11.            }  
12.        });  
13.    }  
14.}  
1.<?xml version="1.0" encoding="utf-8"?>  
2.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
3.    android:layout_width="match_parent"  
4.    android:layout_height="match_parent"  
5.    android:orientation="vertical">  
6.  
7.    <EditText  
8.        android:id="@+id/et_account"  
9.        android:layout_width="match_parent"  
10.        android:layout_height="wrap_content"  
11.        android:layout_marginTop="50dp"  
12.        android:hint="请输入要查询的账号" />  
13.  
14.    <Button  
15.        android:id="@+id/btn_getAccount"  
16.        android:layout_width="wrap_content"  
17.        android:layout_height="wrap_content"  
18.        android:layout_gravity="center_horizontal"  
19.        android:layout_marginTop="80dp"  
20.        android:text="获取账号信息" />  
21.  
22.    <TextView  
23.        android:id="@+id/tv_result"  
24.        android:layout_width="wrap_content"  
25.        android:layout_height="wrap_content"  
26.        android:layout_gravity="center_horizontal"  
27.        android:layout_marginTop="80dp"  
28.        android:hint="账号信息暂未获取" />  
29.  
30.</LinearLayout>  


MVC框架模型

MVC(Model View Controller) 模型(model)-视图(view)-控制器(controller)

  • Controller:Activity、Fragment
  • View:layout、View控件
  • Model:数据处理(网络请求、SQL等)

 

优点: 一定程度上实现了Model与View的分离,降低了代码的耦合性。

缺点: Controller与View难以完全解耦,并且随着项目复杂度的提升,Contrllor将越来越臃肿。

 

MVCActivity(C层)

  • 业务逻辑处理
  • 获取用户输入
  • 展示成功页面
  • 展示失败页面

MVCModel(M层)

  • 查询账号数据

View(V层)

  • Layout

实现步骤

  • 将数据的获取与界面的展示分离(将查询账号数据从Activity中分离到Model中即可)
  • 解决各层之间通信问题(Activity通知Mode获取数据,Model通知Activity更新界面)

结构图如下:

1.public class MVCActivity extends AppCompatActivity implements View.OnClickListener {  
2.    //展示查询结果  
3.    private TextView mTvResult;  
4.    //用户输入信息的输入框  
5.    private EditText mEtAccount;  
6.    private MVCModel mMvcModel;  
7.  
8.    @Override  
9.    protected void onCreate(@Nullable Bundle savedInstanceState) {  
10.        super.onCreate(savedInstanceState);  
11.        setContentView(R.layout.activity_normal);  
12.        initView();  
13.        mMvcModel = new MVCModel();  
14.    }  
15.  
16.    //初始化View  
17.    private void initView() {  
18.        mTvResult = findViewById(R.id.tv_result);  
19.        mEtAccount = findViewById(R.id.et_account);  
20.        findViewById(R.id.btn_getAccount).setOnClickListener(this);  
21.    }  
22.  
23.    @Override  
24.    public void onClick(View v) {  
25.        mMvcModel.getAccountData(getUserInput(), new MCallBack() {  
26.            @Override  
27.            public void onSuccess(Account account) {  
28.                showSuccessPage(account);  
29.            }  
30.  
31.            @Override  
32.            public void onFailed() {  
33.                showFailedPage();  
34.            }  
35.        });  
36.    }  
37.  
38.    //获取用户输入信息  
39.    private String getUserInput() {  
40.        return mEtAccount.getText().toString();  
41.    }  
42.  
43.    //展示获取数据成功的界面  
44.    private void showSuccessPage(Account account) {  
45.        mTvResult.setText("用户账号:" + account.getName() + "|"  
46.                + "用户等级:" + account.getLevel());  
47.    }  
48.  
49.    //展示获取数据失败的界面  
50.    private void showFailedPage() {  
51.        mTvResult.setText("获取数据失败");  
52.    }  
53.}  
1.public class MVCModel {  
2.    //模拟查询账号数据  
3.    public void getAccountData(String accountName, MCallBack callBack) {  
4.        Random random = new Random();  
5.        boolean isSuccess = random.nextBoolean();  
6.        if (isSuccess) {  
7.            Account account = new Account();  
8.            account.setName(accountName);  
9.            account.setLevel(100);  
10.            callBack.onSuccess(account);  
11.        } else {  
12.            callBack.onFailed();  
13.        }  
14.    }  
}