注:MVC模式适用于小型的项目
MVC即:Model层(模型层)、View层(视图层)、Controller层(控制层)
MVC模型图1
MVC模型图2 View和Controller放在了一起,难以完全解耦
优点:
1.一定程度上实现了Model与View的分离,降低了代码的耦合性
缺点:
1.Controller与View难以完全解耦(Activity即是控制器,又承担部分视图层的工作),并且随着项目复杂度的提升,Controller将越来越臃肿
2.Activity太过臃肿,还承担部分业务逻辑
MVC需求实现
1.将数据的获取与界面的展示分离(将获取数据的业务逻辑分离到Model中)
2.解决各层之间的通信问题(Activity通知Model获取数据,Model通知Activity更新界面)
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".framework_mode.normal.NormalActivity">
<EditText
android:id="@+id/ed_account"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:hint="请输入要查询的账号"/>
<Button
android:id="@+id/btn_get_account"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="80dp"
android:text="获取账号信息"/>
<TextView
android:id="@+id/tv_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="80dp"
android:hint="账号信息暂未获取"/>
</LinearLayout>
接口回调
/**
* 定义接口回调
* @author Administrator
*/
public interface MCallback {
/**
* 成功
* @param account
*/
void onSuccess(Account account);
/**
* 失败
*/
void onFailed();
}
实体类
/**
* 账号信息
* @author Administrator
*/
public class Account {
/** 账号名称 */
private String name;
/** 账号等级 */
private int level;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
}
Activity
public class MVCActivity extends AppCompatActivity implements View.OnClickListener {
/** 展示查询结果 */
private TextView mTvResult;
/** 用户输入的信息 */
private EditText mEtAccount;
/** MVCActivity持有MVCModel的引用,可以通知MVCModel*/
private MVCModel mvcModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_normal);
initView();
mvcModel = new MVCModel();
}
/**
* 初始化View
*/
private void initView() {
mTvResult = findViewById(R.id.tv_result);
mEtAccount = findViewById(R.id.ed_account);
findViewById(R.id.btn_get_account).setOnClickListener(this);
}
@Override
public void onClick(View v) {
String userInput = getUserInput();
mvcModel.getAccountData(userInput, new MCallback() {
@Override
public void onSuccess(Account account) {
showSuccessPage(account);
}
@Override
public void onFailed() {
showFailedPage();
}
});
}
/**
* 获取用户输入信息
* @return
*/
private String getUserInput() {
return mEtAccount.getText().toString();
}
/**
* 展示获取数据成功的界面
*/
private void showSuccessPage(Account account) {
mTvResult.setText("用户账号:" + account.getName() + "|" + "用户等级:" + account.getLevel() );
}
/**
* 展示获取数据失败的界面
*/
private void showFailedPage() {
mTvResult.setText("获取数据失败");
}
}
Model
/**
* Model层
* 数据处理(网络请求、SQL等)
* @author Administrator
*/
public class MVCModel {
/**
* 模拟获取账号数据
* @param accountName
* @param callback
*/
public void getAccountData(String accountName, MCallback callback) {
Random random = new Random();
boolean isSuccess = random.nextBoolean();
if (isSuccess) {
Account account = new Account();
account.setName(accountName);
account.setLevel(100);
callback.onSuccess(account);
} else {
callback.onFailed();
}
}
}